1

これは機能します:

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のクローンを実装できると思いますが、それには同様の問題があり(フィールドを追加/削除するときにクローンの実装を更新する必要があるため)、BBean(A a)コンストラクターを持つこともできません。インターフェイスの一部も作成しない限り、BBean(ABean a)コンストラクタのみです。clone()

それで...実装するためのよりクリーンでより良い方法はありますBBean(A a)か?

4

3 に答える 3

1

継承を使用する代わりに、構成を使用してみてください。つまり、 の代わりに、コンストラクターBBean extends ABeanを作成します。そうすれば、 new inのコードを構築する方法のすべての詳細から身を守ることができます。BBeanBBean(ABean a)ABeanBBean

于 2013-02-14T16:17:42.250 に答える
0

次のように、ABeanに「A」コンストラクター(コピーコンストラクター)を実装するのはどうでしょうか。

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にあります。

于 2013-02-14T16:22:05.780 に答える
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();
    }
}

}

于 2013-02-14T16:44:03.177 に答える