【问题标题】:Sort Superclass list of objects that are Subclasses of the Superclass对作为超类的子类的对象的超类列表进行排序
【发布时间】:2014-06-15 19:56:09
【问题描述】:

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

public abstract class Member implements Comparable<Member>

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

public class Coach extends Member

public class Player extends Member

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

我需要对这个列表进行排序,其中教练总是排在第一位,然后是球员,按照识别号排序。

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

我希望我已经清楚了这个问题。

【问题讨论】:

  • 如您所说,在Member 上编写compareTo() 方法来对子类 进行排序是不可能的。您正在尝试编写错误的设计。为了比较它们,您需要处理一个公共字段。
  • 你想如何比较两位教练?

标签: java inheritance polymorphism compareto


【解决方案1】:

这里有几个选项:

  • Member 上写一个compareTo 方法并写一个比较器来检查成员对象是否是Coach 的实例(然后它总是在其他Member 对象之前)。

在这个解决方案中,但是您假设基类会知道它的实现者,这可能被认为是一个糟糕的设计,因为一旦您开始引入更多实现类(即RefereeTechnical Assistant 等),您将每次都需要改变方法,最终可能会变得非常复杂。

另一方面,虽然您已经在一个地方获得了完整的排序控制,这比……更容易测试和推理。

  • 或者使用getOrderingIndicator() 抽象方法扩展成员,您将在Player(分配标识号)和Coach(分配0 或低于允许的玩家标识号的其他值)中实现并使用Member 类中的 compareTo 方法中的这个抽象方法。

在此解决方案中,您将保证将来有任何Member 基类的实现,它们将被正确排序。

总而言之,我强烈建议在成员级别实现 compareTo,因为您要比较的是 Member 对象。

【讨论】:

    【解决方案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
            }
    
        }
    }
    

    【讨论】:

    • 为什么不用 "instanceof" 而不是 getClass()?
    • 只对那个类严格
    • 我明白了。很公平。 :D
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2013-06-06
    • 2014-06-29
    • 2020-06-13
    相关资源
    最近更新 更多