2016-06-16 3 views
0

나는 몇개의 서브 클래스를 가진 abstract 클래스를 가지고있다. 추상 클래스에서는 복사 생성자를 구현했습니다. 이제 복사 생성자를 사용하여 하위 클래스 중 하나를 복제하려고합니다. 어떻게해야합니까? 분명히 나는 ​​어떤 서브 클래스를 복제해야하는지 미리 알지 못한다. 여기 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

의 요청에 따라 내가 어떤 클래스의 인스턴스를 컴파일 타임에 알지 못하고 주어진 객체의 복사본을 만들 볼 수있는 두 가지 방법이 (있다) 질문에 :

  1. 를 사용하여 반사는 클래스이며, 상기 클래스가 적절한 복사 생성자가 무엇인지 런타임에 알고 가정, 원하는 클래스의 복사 생성자를 호출합니다.
  2. 서브 클래스에 의해 오버라이드되는 기본 클래스의 copy 메소드를 호출하십시오.

첫 번째 해결 방법은 리플렉션을 사용해야하므로 좋지 않습니다. 두 번째는 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 하위 클래스에 관계없이 생성자를 직접 호출 할 필요없이 항상 적절한 하위 클래스의 복사본을 얻을 수 있습니다.

관련 문제