2014-06-15 59 views
2

假设我有一个抽象超命名的定义是这样的:排序的超类是超类的子类的对象列表

public abstract class Member implements Comparable<Member> 

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

public class Coach extends Member 

public class Player extends Member 

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

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

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

我希望我已经明确了这个问题。

+0

正如你所说的,在'Member'上编写'compareTo()'方法来排序*子类*是不可能的。你正试图写一个错误的设计。为了比较它们,你需要处理一个共同的领域。 – Lucio

+1

你想如何比较两个教练? –

回答

4

你有几个选择这里:

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

在这个解决方案,但你却认为基类会知道这可能被认为是不好的设计实施者,因为一旦你开始引入更多的实现类(即RefereeTechnical Assistant等),你会每次都需要改变方法,并且可能最终导致一些非常复杂的事情。

在另一方面,虽然你已经有了完整的顺序控制在一个地方,哪一个更容易测试和原因,约比...

  • 或者与getOrderingIndicator() abtract方法,你”扩展成员将在Player(分配识别号码)和Coach(分配0或其他某个低于允许的玩家识别号码的值)中执行,并在Member类中的compareTo方法中使用此抽象方法。

在此解决方案中,您将保证在将来有Member基类的任何实现,它们将被正确排序。尽管如此,我强烈建议在成员级别实现compareTo,因为它是您比较的Member对象。

2

您需要实现比较器和检查对象的类,并采取决定

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 
     } 

    } 
} 
+2

为什么不用“instanceof”而不是getClass()? – EpicPandaForce

+1

要严格,那个类只有 –

+0

我明白了。很公平。 :d – EpicPandaForce