在子类中实现clone()

phu*_*ers 4 java inheritance clone

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

由于B类基本上是A类,有一些额外的字段,我想在clone()B 类的实现中使用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;
      }
    }
Run Code Online (Sandbox Code Playgroud)

这样我就不必clone()在B的clone()方法中复制A 方法中的所有克隆逻辑.不幸的是,这不起作用,因为Java不允许将类A的对象转换为类B的对象.我搜索了如何执行此操作的答案,但似乎没有办法重用克隆逻辑答:这是否意味着每次我向A添加另一个字段时,我都必须手动将此字段的复制添加到所有子类的clone()方法中.这似乎非常容易出错......

Mat*_*arz 7

方法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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

}

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

}
Run Code Online (Sandbox Code Playgroud)

implements Cloneable部分是诀窍.另见Cloneable.

  • 克隆不可克隆. (3认同)