如何实现扩展类的构造函数

时间:2013-02-14 16:13:03

标签: java interface constructor extends implements

这有效:

class ABean implements A {
  protected String field1;
  ...
  protected String fieldn;

  public String getField1() {
   return field1;
  }
  ...
}


class BBean extends ABean {
  public BBean(A a) {
    super();
    this.field1=a.getField1();
    ...
    this.fieldn=a.getFieldn();
  }
}

但是编写这个构造函数B(A a)很麻烦,不实用,而且容易出错,因为如果我在A中添加或删除字段,那么我需要修改那个构造函数,有时可能会忘记初始化一些A中的字段。

我想我可以为ABean实现clone,但是这会有类似的问题(因为当我添加/删除字段时需要更新克隆实现)并且这也不允许我拥有BBean(A a)构造函数;只有BBean(ABean a)构造函数,除非我也创建了接口的clone()部分。

那么...... 是否有更清晰,更好的方式来实施BBean(A a)

3 个答案:

答案 0 :(得分:1)

尝试使用合成,而不是使用继承。也就是说,让BBean extends ABean拥有构造函数BBean而不是BBean(ABean a)。这样,您就可以避免在ABean代码中构建新BBean的所有细节。

答案 1 :(得分:0)

如何在ABean上实现“A”构造函数(copy-constructor),如下所示:

class ABean implements A {
    protected String field1;
    ...
    protected String fieldn;

    public String getField1() {
        return field1;
    }
    ...
    public ABean(A other) {
        this.field1=other.getField1();
        ...
        this.fieldn=other.getFieldn();
    }
}


class BBean extends ABean {
    public BBean(A a) {
        super(a);
    }
}

这样,A的“复制构造函数”映射就在您的ABean中。

答案 2 :(得分:0)

你可以使用反射:

class A {}

class B {
public B(A a) {
    String methodName = null;
    try {
        Field[] fields = a.getClass().getDeclaredFields();
        for (Field field : fields) {
            methodName = field.getName().substring(0, 1).toUpperCase()
                    + field.getName()
                            .substring(1, field.getName().length());
            field.get(a);
            this.getClass().getMethod("set" + methodName, field.getClass()).invoke(a, field.get(a));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}