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

Java - How to implement method clone for base and derived classes

我有三个类:

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

像这样的事情呢。它允许您直接克隆层次结构中的任何 class,并包含来自层次结构中所有更高 class 的数据。

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

}

您可以根据复制构造函数实现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);
    }
}