0
我有一個類層次結構/繼承這樣的:如何將一般的超類實例複製到子類實例?
public class A {
private String name;
// with getters & setters
public void doAWithName(){
...
}
}
public class B extends A {
public void doBWithName(){
// a differnt implementation to what I do in class A
}
}
public class C extends B {
public void doCWithName(){
// a differnt implementation to what I do in class A and B
}
}
因此,在有A級與初始化場「名」一個實例一次。後來我希望這個A的實例被包裝成B或C的實例。所以超類應該被一個子類包裝起來!
我怎樣才能使這個最幹練的方面呢?
我想過一個構造函數,它和getters/setters做了一些複製。但在這種情況下,我必須重複自己 - 這不再是我對DRY最初的要求了!因此,如何通過初始化B的新字段(使用默認值)並將其餘的委託給A中的方法(其知道比B更多的關於A的哪些字段應該被訪問...)來如何扭曲A到B ... )。
以相同的方式:
如果A應該被封裝成C只在C應該初始化C'S「新」字段,委託給B的渦卷方法的方法(因此inits在C B的「新」字段),並在最後B代表A將其字段複製到C的字段中)。
所以最後我有一個C的新實例,它具有A的值(包括繼承層次添加的字段的一些默認初始值)。
但這並不意味着重寫超類中的所有getter/setter? 我的意思是將調用委託給超類。即假設A類中的屬性名稱(帶有getName/setName),所以當使用DecoratorPattern類B時不會擴展A類.B僅獲得A的引用作爲B的構造函數的參數。因此,要調用A的getName()方法B需要有一個方法「getName()」,該方法將此調用委託給A的實例(即B存儲爲私有字段:例如:return this.instanceOfA.getName ))。 – gerry 2010-05-05 11:25:14