2016-06-21 67 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); 
    } 

}