排序作为超类的子类的对象的超类列表

时间:2014-06-15 19:56:09

标签: java inheritance polymorphism compareto

假设我有一个名为的抽象超类,其定义如下:

public abstract class Member implements Comparable<Member>

然后我有两个Member子类,定义如下:

public class Coach extends Member

public class Player extends Member

然后,我有一个Member列表,这意味着它包含CoachPlayer

我需要对这个列表进行排序,其中一个教练总是先来,然后按照识别号码排序。

我需要实现compareTo方法来执行此操作。但是我如何继续,因为我知道我无法在超类Member中实现该方法,因为标识号是Player的属性而Coach不是有吗?

我希望我能清楚这个问题。

2 个答案:

答案 0 :(得分:4)

你在这里有几个选择:

  • compareTo上写一个Member方法并编写一个compator,它将检查成员对象是否是Coach的实例(然后它将始终在其他Member对象之前) 。

在这个解决方案中,然而你假设基类会知道它的实现者可能被认为是一个糟糕的设计,因为一旦你开始引入更多的实现类(即RefereeTechnical 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
        }

    }
}