gpt4 book ai didi

java - 在子类中实现 clone()

转载 作者:搜寻专家 更新时间:2023-11-01 01:36:20 24 4
gpt4 key购买 nike

我有两个类:父类 A 和一些子类 B,它扩展了 A 并且比 A 多了几个字段。我希望能够克隆这两个类,所以我重写了 clone( ) Object 类中的方法。

由于 B 类基本上是具有一些额外字段的 A 类,我想在 B 类的 clone() 实现中使用 A 类的克隆。我已经尝试了一些类似的方法:

    public class A
{
public Object clone()
{
A cloneA = new A();
cloneA.foo = this.foo;
cloneA.bar = this.bar;
return cloneA;
}
}

public class B extends B
{
public Object clone()
{
Object cloneA = super.clone();
B cloneB = (B)cloneA;
cloneB.fieldSpecificForB = this.fieldSpecificForB;
return cloneB;
}
}

这样我就不必在 B 的 clone() 方法中复制 A 的 clone() 方法的所有克隆逻辑。不幸的是,这不起作用,因为 Java 不允许将 A 类对象转换为 B 类对象。我四处搜索如何执行此操作的答案,但似乎无法重用来自A、这是不是意味着我每次给A增加一个字段,我都要手动把这个字段的复制添加到所有子类的clone()方法中。这似乎很容易出错......

最佳答案

clone 的工作方式是,它会自动为您复制所有字段。但是,您必须调用 super.clone() 才能使其工作:

public class A implements Cloneable  // add 'implements'
{
public Object clone()
{
A cloneA = super.clone(); // this copies all fields and returns something of *the same type* as 'this'...
return cloneA;
}
}

public class B extends A //supposed to extend 'A' right?
{
public Object clone()
{
Object cloneA = super.clone(); // this returns object of runtime type B
B cloneB = (B)cloneA; // will work
return cloneB;
}
}

编辑:实际上你的 clone 方法现在什么都不做,所以它等同于写:

public class A implements Cloneable  //add 'implements'
{

}

public class B extends A //supposed to extend 'A' right?
{

}

implements Cloneable 部分可以解决问题。另见 Cloneable .

关于java - 在子类中实现 clone(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com