2011-02-01 44 views
5

我正在寫一個抽象類,我有一個應該由子類定義的變量(在這種情況下,它是一個在超類中使用的int)。我無法決定是否使用默認值來定義protected變量,並讓子類在構造函數中或通過setter方法更改該值。或者在父類中定義一個抽象方法,以便所有子類必須實現它並返回它們想要使用的值(然後使用抽象方法訪問超級類中的方法)。任何人都可以告訴我,爲什麼一種方式比另一種更受歡迎?對於應該由子類指定的數據,我應該使用抽象方法還是實例變量?

抽象方法:

public abstract int getValue(); 

public int getValue() { 
    return 5; 
} 
  • 優點:

軍隊子類來思考這個值,並選擇他們希望它是什麼。

  • 缺點:

沒有缺省值,所以即使多數子類只是想用相同的值仍然要實現該方法。 (該方法可以由非抽象並返回默認值,但你失去迫使子類來思考價值的優勢)

受保護的變量:

protected int value; 

public SubClassImpl() { 
    value = 5; 
} 
  • 優點:

可以定義一個默認值,子類可以忽略它,如果他們不在乎。

  • 缺點:子類的

作者沒有意識到的變量的存在,所以他們可能會被默認的行爲感到驚訝。

+1

值是不可變的嗎?如果不是,誰負責改變價值? – 2011-02-01 14:53:55

+0

沒有要求該值是不可變的,但我不希望它在創建對象後被更改。 – DaveJohnston 2011-02-01 15:10:45

回答

8

嗯,這取決於...

  • 是否值必須能夠對象的生命週期中的變化?如果不是的話,你可能希望使它成爲受保護的構造函數參數,並使其成爲基類中的最終私有變量。

  • 可能子類有理由計算基於其他可變狀態的變量嗎?如果是這樣,抽象的getter將是適當的。

  • 否則,我可能會使用一個私有變量和受保護的setter。我通常不是非私有變量的粉絲。這可以允許您對基類中的值進行更改,例如更改其他計算機字段。爲了避免出現默認值,你可以將它和一個構造函數參數結合起來,強制一個初始值,這個初始值可以通過setter在以後改變。

相關問題