2012-04-28 7 views
1

I持っているクラス「A」、B、C、およびDは、私は一般的なのJava実装は、スーパークラスから完全にコピー

ArrayList<A> stuff; 

にこれらのいくつかの保存と言うのいくつかのサブクラスB、C、およびDは、Aとはまったく異なるデータメンバーを持っていません。それらが異なるのは、異なるオーバーライドされたメソッドによるものです。通常、これは、B、C、及びDを必要とするであろう

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

:私のような

何か(真のサブクラスを維持しながら)、クラスAの別のインスタンスにクラスAのインスタンスをコピーできるようにしたいと思いカスタムコピーメソッドを実装するしかし、これはデータメンバーがまったく同じで、クラスが保存されるように存在するだけなので、無駄に思えます。

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

編集:私は「新しい」呼び出すとき

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

}

:私が正しく考えている場合は

、問題は、私はちょうどスーパーコピーメソッドを持っていた場合に実行しますクラスのどのサブクラスであるかを総称的に判断できず、さらにそのインスタンスを明示的にインスタンス化することはできませんでした。または、これを行う方法はありますか?

+1

なぜスーパークラスにコピー方法を与えるだけではないのですか? –

+0

返事ありがとうございます。編集を参照してください – cemulate

答えて

1

あなたは与えることができるAcopy constructor:あなたが精通

class B extends A { 

    public B(A other) { 
     super(other); 
    } 
} 
1

です:A

class A { 

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

サブクラスもAインスタンスを取り、superコンストラクタにそれを渡されたコンストラクタを公開することができclone?あなたのすべてのフィールドをコピーし、派生クラスを手に入れます。各フィールドのオブジェクトのクローンは作成しませんが、同じ参照を指すように注意してください。

public Object clone() { 
    try { 
     return super.clone(); 
    } catch (CloneNotSupportedException e) {} // Will never happen if your object implements the Cloneable interface 
} 
関連する問題