2015-02-23 140 views
0

讓我們考慮兩個類,SuperClass和​​延伸它:構圖課堂;使用超級或子?

Class SuperClass{ 
    int superDataMember; 
} 

Class SubClass extends SuperClass{ 
    int subDataMember; 
} 

我需要另一個CompositeClass類,可使用超或分組成根據某些標準。我的問題是:我應該使用

  1. SuperClass實例裏面CompositeClass

    • 因此,我可以使用SuperClass實例或​​實例。
    • 但是如果訪問subDataMember的方法在訪問的實例爲SuperClass時會如何運行?
    • 也許一個instanceOf檢查可能在每個方法的開始工作?

      Class CompositeClass { 
          private SuperClass sc; 
      
          public getSuperDataMember() {// some code} 
          public getSubDataMember() { 
          if (this.sc instanceOf SubClass) 
           // some code 
          } 
      } 
      
  2. CompositeClass

    • 這樣的​​一個實例,我將失去訪問SuperClass實例的能力!

      Class CompositeClass { 
          private SubClass sc; 
      
          public getSuperDataMember() {// some code} 
          public getSubDataMember() {// some code 
          } 
      } 
      
  3. 實施的CompositeClass兩個版本,第一個是SuperCompositeClassSuperClass一個實例,並擴展了先用​​實例的第二SubCompositeClass

+0

只要遵循繼承和組成的規則。如果類具有「是」的關係,則繼承。如果類有「有」的關係,那麼組成。 – 2015-02-23 22:30:50

+0

親愛的@JunedAhsan,在這種特殊情況下並不那麼簡單! – 2015-02-23 22:39:54

+0

這取決於我們通過設計我們的類可以使事情變得多麼複雜;-) – 2015-02-23 23:15:32

回答

2

記住,​​也是SuperClass這樣你就不會失去訪問組件作爲SuperClass像你指出的能力。

此外,還有第三種選擇,使用參數多態:

class CompositeClass<T extends SuperClass> 
{ 
    private T component; 
    ... 
} 

這樣就可以使其適應具體情況。這將要求你重寫其他方法,如果不是由SuperClass的接口提供的話。

+0

通過「CompositeClass中的子類的實例」,我的意思是我不能用'SuperClass'的實例創建'CompositeClass'的實例,雖然你提到,我仍然可以訪問從'SuperClass'繼承而來的'SubClass'數據成員。 – 2015-02-23 22:38:20

+0

而在參數多態中,我想我必須提供一個instanceOf Check。我不是嗎? – 2015-02-23 22:39:06

+1

他建議你的CompositeClass類型爲'T'。這樣你可以選擇使用哪種類型的「T」:super或/和sub類型。如果需要,可以使用instanceOf。 – MaxZoom 2015-02-23 23:55:44

0

聽起來像你的問題一樣,你的兩個類可能會更好,因爲實現一個抽象類的方法的兄弟姐妹,而不是父子關係。這可以讓你輕鬆使用多態,如果需要的話可以使用instanceOf。當孩子需要保留父母的所有信息和功能時,父母的孩子關係最純粹地被使用。