2012-07-21 26 views
5

假設我們有一個抽象類A,我們想強制所有的子類都有一個特定的字段。這在Java中是不可能的,因爲我們不能定義抽象字段。如何解決Java中缺少抽象字段的問題?

解決方法1:強制子類實現傳遞所需值的方法。

abstract class A { 
    abstract int getA(); 
} 

缺點:每個子類必須實現的,我們希望讓每一個抽象場的方法。這可能導致許多方法實現。

優勢:我們可以使用的方法getA在抽象類和A與它實現方法無需在每個子類中實現它們。但是該方法背後的價值不能被抽象類所覆蓋。

解決方法2:通過強制子類爲抽象類提供值來模擬抽象字段。

abstract class A { 
    int a; 

    public A(int a) { 
    this.a = a; 
    } 
} 

缺點:當我們有多個領域(> 10),超級構造函數調用會顯得有點醜陋和混亂。

優勢:我們可以使用領域a在抽象類和A與它實現方法無需在每個子類中實現它們。另外,值a可以被抽象類覆蓋。

問題:哪種解決方法是實現目標的常用方法?也許有一個比以上更好的?

+2

我錯過了什麼嗎?爲什麼不簡單地給抽象類一個受保護的*具體*字段?爲什麼渴望「* abstract *」字段?什麼是開始的抽象領域?再一次,我錯過了什麼或沒有理解?我是否過度簡化了您的問題?無論如何,你想要解決什麼行爲問題(而不是代碼問題)? – 2012-07-21 13:39:00

+1

或者您可以提供'getA()'的默認實現,並在需要其他值的位置覆蓋它。 – Keppil 2012-07-21 13:41:06

+0

_你爲什麼要強制所有的子類都有一個字段?這個問題通常更好地表達爲強制他們擁有一個特定的_behavior_,你只需要使用方法規範。 – 2012-07-21 18:34:05

回答

0

我認爲opt.1是清潔劑。有幾個getter和setter不是什麼大不了的,我懷疑許多用例不僅僅是一些抽象的「領域」。

關於opt.2,您忘記了構造函數沒有被繼承,因此需要考慮a的方式來實現所有的子類構造函數。

1

我更喜歡第一個。我不喜歡夫婦班級的文件夾名稱,他們如何處理狀態,以及如何保存它。第一個更接近open/close principal

我建議避免繼承。遺傳是非常脆弱和難以維護的。記得有效的java建議 - 喜歡構圖其他繼承

2

抽象方法可能是最面向對象的。

如果您的字段太多,您可能需要重新分組POJO中的這些字段(如果有新概念的話)。

+1

不錯的特性是,一個可能不存在:int getA(){return 4;}如果屬性總是4的子類或getA(){返回b + c;}如果它依賴於其他字段。 – josefx 2012-07-21 13:50:54

+0

使它成爲一種通用的方法,不僅可能不存在,它的類型可能還不存在。 – 2012-07-21 14:15:35

0

解決方法2是很常見的,因爲優點2:

1)你提到的一個 - 字段不屬於子類 - 它屬於父母,這是重要的,因爲它是由「要求」家長和因爲父母可以用它

2)當子類從父,你非常瞭解這個領域的,因爲當你實現構造函數,您必須通過它。如果我看到第一個解決方法,我不知道要從中理解什麼,這樣我就明白父類需要這個字段才能工作,所以它必須有一個有意義的價值。

注意:如果你有一個具有10個字段需要被初始化的東西一類是在您的設計可能是錯的。

0

其實它不是一個關於什麼喜歡,但其對靈活性,並適應變化的能力 。

2.它總是更好封裝不斷變化的行爲,無論是接口或抽象類。

1解決方法將在地方不錯,你需要在不同類別相同行爲不同的實現。然後在這個地方或者一個接口或您的1解決方法將是一個不錯的選擇。

例如:

考慮Paintingpaint()方法的一類。

現在

paint()方法可以有撫摸,滑翔,陰影等方式做這件事的。

然後它能夠​​更好地封裝該方法成抽象類或一個接口。

public interface Paint{ 

paintDoIt(String style); 

} 

4.第二Wordaround將要在其中某些行爲是由子類實現必須在一個地方,好。

如:

考慮汽車作爲一個抽象類,現在to be car其非常重要的,它必須有 督導,4個車輪,發動機等,所以這些功能必須實現

時,其它功能,如音樂系統,LCD等都是可選的並取決於車型。

相關問題