クラス「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のサブクラスであるかを一般的に判別できず、さらにそのインスタンスを明示的にインスタンス化できませんでした。またはこれを行う方法はありますか?