2013-03-10 100 views
1

我有一個基類和子類。基類有我想在子類中使用的常用方法和實現,但我想使用子類成員變量而不是超類。我不想在子類中重寫相同的方法。 Java中有沒有辦法實現這一點。在超類方法中使用子類成員變量?

+0

不能覆蓋領域,但是你可以重寫getter方法,等等我認爲一種可能的解決方案是使用* getter *方法來獲取字段。 – 2013-03-10 21:50:07

+1

你能更具體一點你想達到什麼嗎?我可以想象一個抽象類是你正在尋找的。 – Trinimon 2013-03-10 22:10:23

回答

0

您可以使用方法訪問成員並在子類中覆蓋它。

Class A{ 
    public void DoStuff(){ 
    int aux = getResource; 
    /*cool things with aux*/ 
    } 
    protected int getResource(){ 
    return internal_member; 
    } 
    private int internal_member; 
} 

Class B extends A{ 
    private int another_member; 
    @Override 
    public int getResource(){ 
    return another_member; 
    } 

} 

但考慮到這不會阻止人們直接使用成員換款A級,這可能是更好的創建成員和干將的基類。

另一種選擇,像有些人之前列出是有數據成員在基類的保護,並在子類中初始化:

Class A{ 
    public void DoStuff(){ 
    /*cool things with internal_member*/ 
    } 
    protected List internal_member; 
    A(){internal_member = /*Set here a value*/} 
} 

Class B extends A{ 
    B(){internal_member = /*Set a different value here! you can even declare a member and assign it here*/} 

} 

如果您可以根據需要使用的構造方法的參數。

+0

這是看起來很奇怪的Java代碼。它看起來幾乎像C++對我來說。 – 2013-03-10 22:41:45

+0

@HovercraftFullOfEels謝謝!我整天都用C++,當我寫出答案時,我做得很快,並沒有意識到!大聲笑 – 2013-03-11 08:53:07

+0

我有這樣的事情:public class Base { List A; 鹼(){ this.A = A } 公共doSomethingOnList(){} } 公共子延伸基地{ @override 列表B; child(){ super(); this.B = B } } 我想doSomethingOnList()方法在基類中定義使用Child類List B而不是List A.我不想在子類中寫同樣的方法。繼承是否照顧到這一點,或者我必須編寫setter? – user2154810 2013-03-11 11:34:06

0

您可以創建的成員變量&一個protected二傳手然後子類的構造函數中覆蓋超類的變量的值:

class Animal { 
    private String voice = "Oooo"; 

    protected void setVoice(String voice) { 
     this.voice = voice; 
    } 

    public void speak() { 
     System.out.println(this.voice); 
    } 

} 

class Dog extends Animal { 

    public Dog() { 
     setVoice("woof"); 
    } 

} 
+0

謝謝大家!上述討論對我很有幫助 – user2154810 2013-03-11 15:09:27

相關問題