2016-06-21 65 views
0

我有三类:爪哇 - 如何实现方法克隆为基础,派生类

类的
Base extends Object 

Derived1 extends Base 

Derived2 extends Derived1 

每个人都有自己的字段应该被克隆。我在理解实现clone的最佳方式时遇到麻烦,并避免重复代码。我有以下架构,但看起来对我来说最差

Derived2.clone():它调用super.clone()并收到Derived1的对象。然后它调用新的Derived2(objOfDerived1),其调用super(objOfDerived1),其复制其所有字段,然后在Derived2.clone()中复制Derived2的所有字段。

你会怎么说呢?也许有任何文章描述这个问题?

UPD:这个想法在这里可以

class Base implements Cloneable { 
    private String dataOfBase; 

    public Base() { 

    } 

    public Base(Base base) { 
     this.dataOfBase = base.dataOfBase; 
    } 

    @Override 
    public Object clone() { 
     Base base = new Base(); 
     base.dataOfBase = dataOfBase; 
     return base; 
    } 
} 

class Derived extends Base { 
    private String dataOfDerived; 

    public Derived(Base base) { 
     super(base); 
    } 

    @Override 
    public Object clone() { 
     Base base = super.clone(); 
     Derived derived = new Derived(base); 
     derived.dataOfDerived = dataOfDerived; 
     return derived; 
    } 
} 
+0

如果克隆一个'Derived2',你的'super.clone()来'将返回的实例'Derived2',而不是'Derived1',也不是'Object'。 – tkausl

+1

为什么你先调用'''super.clone()''',然后调用'''new Derived2'''?我只是调用新的Derived2(this);''并在拷贝构造函数中实现拷贝。如果你不打算使用'''Object.clone()'''任何方式。 –

+0

@JornVernee,是的,它可能更有用 – Ivan

回答

3

你可以在拷贝构造函数方面实现clone

class Base { 
    private String dataOfBase; 
    ... 
    public Base(Base other) { 
     this.dataOfBase = other.dataOfBase; 
    } 

    @Override 
    public Base clone() { // Covariant return type 
     return new Base(this); // calling copy constructor 
    } 
} 
class Derived extends Base { 
    private String dataOfDerived; 
    ... 
    public Derived(Derived other) { 
     super(other); 
     this.dataOfDerived = other.dataOfDerived; 
    } 

    @Override 
    public Derived clone() { 
     return new Derived(this); 
    } 
} 
0

出什么这样的事情。它将允许您直接克隆层次结构中的任何类,并包含来自层次结构中更高级的所有类的数据。

public class Derived1 extends Base { 

    public Derived1 clone(Derived1 foo) { 
     super.clone(foo); 
     // copy fields from Derived1 
     return foo; 
    } 

    public Derived1 clone() { 
     Derived1 foo = new Derived1(); 
     return this.clone(foo); 
    } 

}