2011-12-29 174 views
0

我想將超類的實例傳遞給子類的構造函數。我的第一個想法是交換子類中的超類的實例類似於JavaScript的原型,但我被告知here Java不支持交換超級實例的引用,因爲本身沒有超級實例。用於子類實例的Java淺拷貝超類實例

爲了規避這個問題,我想使用一個接受超類實例的複製構造函數。然後,我將不得不重新鏈接所有引用,從長遠來看,當其他人擴展超類的代碼並忘記子類中的複製構造函數時,會引發錯誤。

問題:是否有一些乾淨利落的方法來自動複製所有引用,也許有一些反射機制來防止未來的bug?

+0

我不知道我是否明白你在這裏試圖做什麼。但是,在子類中使用'super'會讓你訪問超級類。 \t'公共類A { \t \t \t \t公共無效測試(){ \t \t \t \t \t} \t} \t \t公共類別B延伸的{ \t \t公共B(){ \t \t \t super.test(); \t \t} \t}' – Dimitry 2011-12-29 17:13:48

+0

不帶構造函數的醜陋選項是clone()。 http://www.go4expert.com/forums/showthread.php?t=5424 – Stefan 2011-12-29 17:38:51

+0

在超類中有複製構造函數,並從子類的複製構造函數中調用此複製構造函數而不是您要查找的內容?或者我不完全瞭解你的問題?如果你可以描述你想要解決什麼問題,那麼問題可能會更加清楚 – Robin 2011-12-29 20:04:13

回答

1

您不應該將超類實例中的所有引用複製到子類實例中。順便說一下,如果這些引用在超類中被聲明爲私有字段,則它們甚至不應該從子類訪問(正如它們通常應該這樣)。

什麼你可能需要的是代表團,而不是繼承:

// Foo is the superclass 
private class FooAdapter { 
    private Foo foo; 

    public FooAdapter(Foo foo) { 
     this.foo = foo; 
    } 

    public void doThis() { 
     return foo.doThis(); 
    } 
} 

FooAdapter可以延長美孚或(更好)theyr應該實現一個共同的接口,但是這不是必需的。

如果這不能解決您的問題,請告訴我們您想要做什麼,而不是告訴我們您想如何做。你想解決什麼問題?

+0

是的,你得到我的問題,但我不想委派,因爲類是否是一個乾淨的繼承。這只是大量額外的代碼,其中一行功能委託給另一個實例。如果「破碎」克隆是我唯一的選擇,我真的只想提取一個通用界面。但是我會回顧一下代碼,也許一個乾淨的界面會使一些訪問模式過時並且編譯成一個整潔的界面。 – 2011-12-29 18:01:34