2017-06-12 46 views
1

鑑於基類被定義爲,強制基於存取方法嚴格繼承

abstract Base{ 
    protected int field; 
    protected int getter(){ 
     return this.field; 
    } 
    ... 
} 

隨着進行分類的子類型,該吸氣劑的基礎上的意圖,我創建的接口等,

interface MyFieldGettable{ 
    public int getter(); 
} 

,我很高興創造一個子類型,比如,

class CantGetField extends Base{ 
    .... 
} 

而且,因爲基本版本已經打​​印ŧ他現場,讓我們補子類型一樣,

class CanGetField extends Base implements MyFieldGettable { 
    public int getter(){ 
     return this.getter(); 
    } 
} 

現在,在一段代碼某處有一個List<Base>,我想隔離兩種類型,並檢查CanGetField類型的字段。因此,我寫,

for(Base b:listOfBase){ 
    if(b instanceof CanGetField){ 
     int field = ((CanGetField)b).getter(); 

而且,如果你有任何人會現在已經猜到了。這吹到StackOverflowError。現在,我可以通過糾正CanGetField類作爲定義解決這個問題,

class CanGetField extends Base implements MyFieldGettable { 
    public int getter(){ 
     return this.field; 
    } 
} 

或者,我可以在界面更改getter方法的名稱,並委託子類型的基礎方法的所有調用。但是,這會在子類型中導致大量冗餘代碼。

有沒有其他的解決方案。

+3

'return super.getter()',大概? –

+1

@OliverCharlesworth你在我前面49秒( –

+0

)難道我看起來很愚蠢嗎?是在想這個地獄和天堂嗎? – soufrk

回答

2

這會打擊StackOverflowError。現在,我可以解決這個問題通過 糾正類CanGetField的定義,

getter()做無限遞歸調用在這裏:

class CanGetField extends Base implements MyFieldGettable { 
    public int getter(){ 
     return this.getter(); 
    } 
} 

如果你想覆蓋getter()方法只能改變改性劑,而不是它的行爲,你可以調用super.getter()

class CanGetField extends Base implements MyFieldGettable { 
    public int getter(){ 
     return super.getter(); // super implementation 
    } 
} 
+0

並且使用'super.getter()'代替它。 –

+0

他想用 – davidxxx

+0

準確地說,我得到了StackOverflowError的原因。不管怎樣,感謝輸入。 – soufrk

0

至於建議用戶,在問題的意見itsel F。這是我正在尋找,

class CanGetField extends Base implements MyFieldGettable { 
    public int getter(){ 
     return super.getter(); 
    } 
}