2010-05-05 86 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