java - 对作为父类(super class)的子类的对象的父类(super class)列表进行排序

标签 java inheritance polymorphism compareto

假设我有一个名为的抽象父类(super class),其定义如下:

public abstract class Member implements Comparable<Member>

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

public class Coach extends Member

public class Player extends Member

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

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

我需要实现compareTo方法来做到这一点。但是,知道我无法在父类(super class) Member 中实现该方法,我该如何继续? ,因为标识号是 Player 的属性和Coach没有吗?

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

最佳答案

这里有几个选项:

  • Member上编写一个compareTo方法,并编写一个比较器来检查成员对象是否是Coach的实例(然后它将始终位于其他成员对象)。

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

另一方面,尽管您在一个地方拥有完整的排序控制,但这比......更容易测试和推理

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

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

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

关于java - 对作为父类(super class)的子类的对象的父类(super class)列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233554/

相关文章:

java - 我应该如何在 Java 中实现 Message 类的子类型?

c++ - RTTI 为多态对象存储了哪些信息?

java - 使用 JLabel 将 JTextArea 插入 JPanel

java - 在 JPA 中指定延迟加载时,会加载所有子项还是仅加载一个子项?

c++ - 我可以继承模板类并将类型设置为我当前尝试继承的类的模板化子类吗?

java - mongoTemplate.save() 一个抽象类

java - 如果按顺序插入和访问,应该使用LinkedHashMap还是TreeMap?

java - 在非 Activity 课上使用 Volley 和 Klaxon

c++ - 未形成派生类数组

C# GetMethod 不返回父方法