java - 在子类中实现 clone()

标签 java inheritance clone

我有两个类:父类 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/

相关文章:

java - 如何在同一个面板 Extjs 4.2 中多次使用相同的 xtype?

java - 创建 spark 客户端失败 : Hive on spark exception

python - 在 Python 中弃用一个类作为父类

jquery克隆表单元素并将其插入表单中

Javascript:克隆/复制/扩展后对象 setter 和 getter 丢失

java - 如何在CXF中设置范围?

java - 我正在尝试将数据输入到 parse.com 中的 custommom 列,但出现错误

JButton的Java子类覆盖setEnabled方法问题

c++ - 继承的构造函数 - 定义可移植的固定大小类型 (C++)

git svn clone 创建空的 git 存储库?