2014-06-15 73 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