假设我有一个名为的抽象超类,其定义如下:
public abstract class Member implements Comparable<Member>
然后我有两个Member
子类,定义如下:
public class Coach extends Member
public class Player extends Member
然后,我有一个Member
列表,这意味着它包含Coach
和Player
。
我需要对这个列表进行排序,其中一个教练总是先来,然后按照识别号码排序。
我需要实现compareTo
方法来执行此操作。但是我如何继续,因为我知道我无法在超类Member
中实现该方法,因为标识号是Player
的属性而Coach
不是有吗?
我希望我能清楚这个问题。
答案 0 :(得分:4)
你在这里有几个选择:
compareTo
上写一个Member
方法并编写一个compator,它将检查成员对象是否是Coach的实例(然后它将始终在其他Member
对象之前) 。 在这个解决方案中,然而你假设基类会知道它的实现者可能被认为是一个糟糕的设计,因为一旦你开始引入更多的实现类(即Referee
,Technical Assistant
等。你每次都需要改变方法,最终可能会出现一些非常复杂的问题。
另一方面,尽管你已经在一个地方获得了完整的订购控制,这比...更容易测试和推理...
getOrderingIndicator()
abtract方法扩展成员,您将在Player
(分配标识号)和Coach
中实施(指定0或低于允许的其他值)玩家识别号码)并在compareTo
类的Member
方法中使用此抽象方法。 在此解决方案中,您将保证将来有Member
基类的任何实现,它们将被正确排序。
总而言之,我强烈建议在会员级别实施compareTo
,因为它是您要比较的Member
个对象。
答案 1 :(得分:2)
您需要实施Comparator并检查对象的类并做出决定
abstract class Member implements Comparator<Base>{
@Override
public int compare(Base o1, Base o2) {
if(o1.getClass() == Couch.class && o2.getClass() == Player.class){
return Integer.MAX_VALUE;
}
if(o1.getClass() == Player && o2.getClass() == Coach.class){
return Integer.MIN_VALUE;
}
if(o1.getClass()==o2.getClass() && o1.getClass() == Coach.class){
return 0;
}
if(o1.getClass() == o2.getClass() && o2.getClass() == Player.class){
//cast to player and compare them
}
}
}