1

クラス「A」のサブクラスがいくつかあります。たとえば、B、C、Dです。これらのいくつかをジェネリックに保存します。

ArrayList<A> stuff;

B、C、およびDには、Aとまったく異なるデータメンバーはありません。それらが異なる唯一の方法は、オーバーライドされたメソッドが異なることです。クラスAの任意のインスタンスをクラスAの別のインスタンスにコピーできるようにしたいと思います(真のサブクラスを保持しながら)

何かのようなもの:

A obj1 = (A)new B(...)
A obj2 = (A)new C(...)
A obj3 = obj1.copy();
// (obj3 instanceof B) == true

通常、これにはカスタムコピーメソッドを実装するためにB、C、およびDが必要です。ただし、データメンバーはまったく同じであり、クラスが保持されるようにのみ存在するため、これは無駄のように思われます。

クラスAにコピーを実装するだけで、オブジェクトの基になるクラスを保持する方法はありますか?

編集:

私が正しく考えている場合、スーパークラスだけにコピーメソッドがある場合に遭遇する問題は次のとおりです。

class A {
    int dataMember;
    public A copy() {
        A ret = new A(); // !!
        ret.dataMember = dataMember;
        return ret;
    }

}

「new」を呼び出すとき、クラスがAのサブクラスであるかを一般的に判別できず、さらにそのインスタンスを明示的にインスタンス化できませんでした。またはこれを行う方法はありますか?

4

2 に答える 2

1

クローンに精通していますか?すべてのフィールドをコピーし、派生クラスを維持します。各フィールドのオブジェクトのクローンは作成されませんが、同じ参照を指すことに注意してください。

public Object clone() {
    try {
        return super.clone(); 
    } catch (CloneNotSupportedException e) {} // Will never happen if your object implements the Cloneable interface
}
于 2012-04-28T03:40:01.423 に答える
1

コピー コンストラクターAを指定できます。

class A {

    public A(A other) {
        //copy other's fields to this instance
    }
}

のサブクラスは、インスタンスを取得してコンストラクターに渡すAコンストラクターを公開することもできます。Asuper

class B extends A {

    public B(A other) {
        super(other);
    }
}
于 2012-04-28T02:25:42.313 に答える