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。