Java-如何实现基类和派生类的方法克隆

Java-如何实现基类和派生类的方法克隆,java,clone,Java,Clone,我有三门课: Base extends Object Derived1 extends Base Derived2 extends Derived1 每个类都有自己的字段,这些字段应该被克隆。我很难理解实现克隆和避免重复代码的最佳方法。我有以下架构的一个例子,但在我看来它是最糟糕的 Derived2.clone:它调用super.clone并接收Derived1的对象。然后它调用新的Derived2objOfDerived1,该函数调用superobjOfDerived1,复制其所有字段,

我有三门课:

Base extends Object

Derived1 extends Base

Derived2 extends Derived1
每个类都有自己的字段,这些字段应该被克隆。我很难理解实现克隆和避免重复代码的最佳方法。我有以下架构的一个例子,但在我看来它是最糟糕的

Derived2.clone:它调用super.clone并接收Derived1的对象。然后它调用新的Derived2objOfDerived1,该函数调用superobjOfDerived1,复制其所有字段,然后在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;
    }
}

像这样的怎么样。它允许您直接克隆层次结构中的任何类,并包含层次结构中所有更高级别的类的数据

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);
   }

}

像这样的怎么样。它允许您直接克隆层次结构中的任何类,并包含层次结构中所有更高级别的类的数据

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);
   }

}
您可以根据复制构造函数实现克隆:

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 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
    }
}

如果克隆Derived2,super.clone将返回Derived2的实例,而不是Derived1或对象。为什么先调用super.clone,然后再调用new Derived2?我只会称之为新的衍生工具;并在复制构造函数中实现复制。如果您不打算以任何方式使用Object.clone。@Jornverne,是的,它可能会更有用useful@tkausl为什么?看起来会调用Derived1.clone,并且应该返回Derived1的对象。如果您使用的是对象克隆方法,则不会返回。Object.clone始终返回运行时类型的副本,即使它表示返回对象。因此,如果你克隆了一个Derived2,你会得到一个Derived2,即使Derived1说你会得到一个Derived1。如果你克隆了一个Derived2,你的super.clone将返回一个Derived2的实例,而不是Derived1或对象。为什么你先调用super.clone,然后再调用new Derived2?我只会称之为新的衍生工具;并在复制构造函数中实现复制。如果您不打算以任何方式使用Object.clone。@Jornverne,是的,它可能会更有用useful@tkausl为什么?看起来会调用Derived1.clone,并且应该返回Derived1的对象。如果您使用的是对象克隆方法,则不会返回。Object.clone始终返回运行时类型的副本,即使它表示返回对象。所以,如果你克隆了一个Derived2,你会得到一个Derived2,即使Derived1说你会得到一个Derived1。