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);
}
}
我有三个类:
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);
}
}