我还有下节课
class Person { private String name; }
class Student extends Person { private int studyPlace; private int studyYears; }
class Worker extends Person { private String workPosition; private int experienceYears; }
我想把所有这些类存储在一个集合中 List<Person> persons.
为了分类,我想用下一节课
class DurationComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
if (o1 == null && o2 == null) {
return 0;
}
if (o1 == null) {
return 1;
}
if (o2 == null) {
return -1;
}
int p1 = 0;
int p2 = 0;
if (o1 instanceOf Student){
p1 = ((Student) o1).getStudyYears();
}
if (o1 instanceOf Worker){
p1 = ((Worker) o1).getExperienceYears();
}
if (o2 instanceOf Student){
p2 = ((Student) o2).getStudyYears();
}
if (o2 instanceOf Worker){
p2 = ((Worker) o2).getExperienceYears();
}
return p2 - p1;
}
}
我知道lsp普林西比。将子类类型转换为基类型是一种好的做法吗?
1条答案
按热度按时间vcirk6k61#
我觉得不太好。你的“person”比较器必须知道所有可能的子类。当您稍后添加“manager extends person”时,必须修复comparator,否则所有经理都是相同的。如果还有其他人没有什么“年”的价值,你不知道该怎么比较。
一个更好的方法是让person有一个抽象方法,返回用于比较的数字。
那么比较器的主体(忽略空的考虑)就是
这是对person的侵犯,因为首先它为您以前没有的person添加了一个方法,其次它强制每个person子类公开一个合适的'years'值。另一方面,如果你不这样做,那么能够比较武断的人的想法是没有根据的。