2010-05-05 88 views
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的值(包括繼承層次添加的字段的一些默認初始值)。

回答

2

看來你只是想實現一個Decorator Pattern

+0

但這並不意味着重寫超類中的所有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