2016-06-16 18 views
0

私はいくつかのサブクラスを持つ抽象クラスを持っています。抽象クラスでは、コピーコンストラクタを実装しました。今、コピーコンストラクタを使用してサブクラスの1つを複製したいのですが、どのようにすればいいですか?明らかに、私はどのサブクラスをクローン化しなければならないかを事前に知らない。ここでJavaで親抽象コピーコンストラクタを使用してサブクラスをコピーするにはどうすればよいですか?

は、私が何をしたいの例です。

abstract class AbstractClass { 
    public AbstractClass(AbstractClass ac) { 
     this(); 
     setX(ac.getX()); 
     setY(ac.getY()); 
    } 

    // Some setter and getter for X and Y variables 
} 

class SubclassA extends AbstractClass { 
    public SubclassA(SubclassA a) { 
     super(a); 
    } 
} 

class SubclassB extends AbstractClass { 
    public SubclassB(SubclassB b) { 
     super(b); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     AbstractClass a = new SubclassA(); 
     AbstractClass b = new SubclassB(); 

     // Get a copy of "a" or "b" using the copy constructor of abstract class   
     AbstractClass newA = AbstractClass(a); 
     AbstractClass newB = AbstractClass(b); 
    } 
} 
+1

なぜ、 'clone()'を使わないのですか( 'Cloneable'を実装してください)?それは 'AbstractClass newA = a.clone()'であり、共変な戻り値型では、 'SubclassA'メソッドは' AbstractClass'の代わりに 'SubclassA'の戻り値型を持つことができます。 – Thomas

+0

サブクラスの実装の詳細がわからないため、スーパークラスのCopyconstructorを使用することはできません。サブクラスのcopyconstructorを使用するか、 'clone()'を使用してください –

+0

[他のコメントによると、クローンはお勧めしません。](http://stackoverflow.com/questions/4081858/about-java-cloneable) コピーコンストラクタを扱うには...しかし、そうでなければクローンメソッドで行う方法がないなら、私はクローンメソッドでそれを行います。 –

答えて

0

私が要求したとして(インスタンス化するクラスをコンパイル時に知らずに、指定されたオブジェクトのコピーを作成するために見ることができる唯一の2つの方法があります。

  1. 実行時にクラスが何であるかを知っていること、そしてそのクラスに適切なコピーコンストラクタがあることを前提として、Reflectionを使用して目的のクラスのコピーコンストラクタを呼び出します。
  2. サブクラスによってオーバーライドされる基本クラスのcopyメソッドを呼び出します。

最初の解決策は、Reflectionを使用する必要があるため、適切ではありません。 2番目の方法は、clone()/Cloneable標準メカニズム(その問題にかかわらず)、またはカスタム定義の "copy()"メソッドで実装できます。あなたの選択。

0
abstract class AbstractClass { 
    public AbstractClass(AbstractClass ac) { 
     this(); 
     setX(ac.getX()); 
     setY(ac.getY()); 
    } 

    public abstract AbstractClass clone(); 

    // Some setter and getter for X and Y variables 
} 

class SubclassA extends AbstractClass { 
    public SubclassA(SubclassA a) { 
     super(a); 
    } 

    @Override 
    public SubclassA clone() { 
     return new SubclassA(this); 
    } 
} 

class SubclassB extends AbstractClass { 
    public SubclassB(SubclassB b) { 
     super(b); 
    } 

    @Override 
    public SubclassB clone() { 
     return new SubclassB(this); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     AbstractClass a = new SubclassA(); 
     AbstractClass b = new SubclassB(); 

     // Get a copy of "a" or "b" using the copy constructor of abstract class   
     AbstractClass newA = a.clone(); // is instance of SubclassA 
     AbstractClass newB = b.clone(); // is instance of SubclassB 
    } 
} 

ここでのトリックは(Cloneableので、これまでのものとは何の関係もありません)あなた自身のclone方法を使用することです。このメソッドは、適切なコピーコンストラクタを呼び出します。

これは、コピーコンストラクタのすべての利点を得ることを意味し、AbstractClassのhwtaサブクラスに関係なく、コンストラクタを自分で呼び出す必要なく、常に適切なサブクラスのコピーを取得できます。

関連する問題