Java:如何构造给定基类实例的派生类实例?

时间:2018-03-08 02:24:21

标签: java

假设:

MyModel.first.as_json

我想写:

@lombok.Data // generates get/set methods for all data members
public class Base {
    private int x;
    private double y;
    private String z;
    ...
}


public class Derived extends Base {
    private int extra;
    public String addedMethod() { ... }
}

生成Derived实例,其Base属性值与'baseInstance'相同。

如果符合以下条件,最有效的方法是什么:

  1. Base和Derived都可以修改
  2. Base已关闭但Derived已打开
  3. 我想避免在Derived代码中明确枚举Base的成员,如下所示:

    Derived createDerived(Base baseInstance, int extra) { ... }
    

    或者这个:

        Derived createDerived(Base b, int extra) {
          setX(b.getX());
          setY(b.getY());
          setZ(b.getZ());
          ...
          this.extra = extra;
        }
    

    对Base的任何添加都会破坏Derived类代码。

    使用Base的假设复制构造函数

    ,这样的事情会更好
    Derived createDerived(Base b, int extra) {
        super(b.getX(), b.getY(), b.getY(), ...);
        this.extra = extra;
    }
    

    生成该复制构造函数的最佳方法是什么?同样,最好避免枚举Base的每个成员。

1 个答案:

答案 0 :(得分:3)

如果可以修改Base,我会添加一个复制构造函数并从Derived调用它:

class Base {
    int field;

    Base(int field) {
        this.field = field;
    }

    Base(Base base) {
        this(base.field);
    }
}

class Derived extends Base {
    int extra;

    Derived(Base base, int extra) {
        super(base);
        this.extra = extra;
    }
}

如果您无法修改Base,您仍然可以将实例传递给Derived,然后通过super分别复制每个字段:

Derived(Base base, int extra) {
    super(base.field, extra);
}