2010-05-11 95 views
3

我有代碼看起來像這樣:我可以讓派生類在Java中從其基類繼承派生成員嗎?

public class A 
{ 
    public void doStuff() 
    { 
     System.out.print("Stuff successfully done"); 
    } 
} 

public class B extends A 
{ 
    public void doStuff() 
    { 
     System.out.print("Stuff successfully done, but in a different way"); 
    } 

    public void doMoreStuff() 
    { 

     System.out.print("More advanced stuff successully done"); 
    } 
} 

public class AWrapper 
{ 
    public A member; 

    public AWrapper(A member) 
    { 
     this.member = member; 
    } 

    public void doStuffWithMember() 
    { 
     a.doStuff(); 
    } 
} 

public class BWrapper extends AWrapper 
{ 
    public B member; 

    public BWrapper(B member) 
    { 
     super(member);   //Pointer to member stored in two places: 
     this.member = member; //Not great if one changes, but the other does not 

    } 

    public void doStuffWithMember() 
    { 
     member.doMoreStuff(); 
    } 
} 

然而,這段代碼有問題。我在兩處存儲了對成員的引用,但如果其中一個發生了變化,另一個則不會發生,則可能會出現問題。我知道在Java中,一個繼承的方法可以將其返回類型(也可能是參數,但我不確定)縮小到派生類。田地也是如此嗎?

回答

4

您可以使用泛型更好地完成此操作。

public class AWrapper<T extends A> 
{ 
    public T member; 
    public AWrapper(T member) 
    { 
     this.member = member; 
    } 

    public void doStuffWithMember() 
    { 
     a.doStuff(); 
    } 
}  

public class BWrapper extends Wrapper<B> 
{ 
    public BWrapper(B member) 
    { 
     super(member); 
    } 

    public void doStuffWithMember() 
    { 
     member.doMoreStuff(); 
    } 
} 

該子類包裝指定B的類型,可以訪問在BWrapper B的功能,而不存儲的附加引用的事實。

+1

不一定。您可以根據需要將包裝器泛化爲很多層,但如果您正在進行這種編碼,則可能會錯誤地對域進行建模。 – Jherico 2010-05-11 19:16:28

+0

對不起,我混淆了我過去的經歷,我不想將二級課程泛化爲可讀性問題。是的,一個人願意讓'BWrapper'通用它會正常工作。 – doublep 2010-05-11 19:44:06

+0

這個語法是什麼意思? '公衆班'?我只看過類型參數_after_標識符 – Eric 2010-05-14 06:24:38

0

在你的班級BWrapper你必須刪除行public B member;。並在方法doMoreStuffWithMember()替換行:

((B) member).doMoreStuff(); 
+1

如果你必須演員,你做錯了。 – Jherico 2010-05-11 18:59:47

+0

@Jherico:但在這種情況下,你確定它是'B'的一個實例。 – 2010-05-11 19:37:11

+0

由於'AWrapper.member'是'public'並且可以設置爲非'B'實例,因此您無法確定此處是否寫入。如果屬性被「保護」,你甚至不會安全,因爲'BWrapper'的某個子類可以設置屬性。 – 2010-05-11 20:34:24