2014-12-24 7 views
1

다른 개체의 수퍼 클래스를 포함하는 개체의 복사본을 만들고 싶습니다. 이 예에서는 Toy이 포함 된 Box 사본을 만들고 싶습니다. 그러나 모든 종류의 장난감이 상자에 들어있을 수 있습니다. Toy에 복사 생성자를 만드는 가장 좋은 방법은 무엇입니까?다른 개체의 수퍼 클래스를 포함하는 개체 복사

class Box { 
    Toy toy; 
    public Box(Toy toy) { 
     this.toy = toy; 
    } 
    public Box(Box box) { 
     this.toy = new Toy(box.getToy()); 
    } 
} 
abstract class Toy { 
    public Toy(String name) { 
     // ... 
    } 
} 
class Car extends Toy { 
    public Car(String name) { 
     super(name); 
     // ... 
    } 
} 
class Puppet extends Toy { 
    public Puppet(String name) { 
     super(name); 
     // ... 
    } 
} 

나는이 문제에 어떻게 접근해야하는지 정말로 모른다. 당신이 장난감 유형의 상수가있는 경우

public Box(Box box) { 
    this.toy = (Toy) box.getToy().clone(); 
} 

은 또한, 대신 클래스의 열거를 사용할 수 있습니다

답변

6

으로 변경하십시오. Toy에는 반환 유형이 Toy 인 추상화 방법 copy()이 있습니다. 그런 다음 CarPuppet에서이를 무시해야합니다. Box의 복사 생성자에서 box.getToy().copy()을 사용할 수 있습니다.

+0

왜 특정 방법을 만드나요? 'Object.clone'은 이미이 의미를 가지고 있습니다 – Dici

+1

당신은'clone()'을 사용할 수 있습니다. 나는 혼란 스럽기 때문에 그것을 피하는 것을 선호한다 ('Cloneable'은'clone' 메소드 등을 가지고 있지 않다). –

+0

'Cloneable '을 사용하는 것이 완벽하고 안전하다고 생각합니다. doc : http://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html – Dici

1

는 그런 다음 복제 각 Toy의 서브 클래스의 방법을 대체 할 수 있습니다.

0

나는이 구조가 아이디어를 가지는데 도움이된다고 생각한다.이 경우에는 상자 생성자를 사용하여 BoxClasser를 SuperClass (장난감)에 전달하고 장난감 클래스에서는 장난감 클래스의 객체를 수락하는 생성자를 갖게된다. getInstance Initialize 장난감 객체의 메소드 (예를 들어). 당신이 특정 방법이 표시되지 않는 다른 클래스 (하위 클래스)를 원하고 그들에게 비공개로하고 원하는 경우 하위 클래스가 설정에 액세스하지 않은 단지 속성을하지 않는 경우

class Box extends Toy 
{ 
    public Box(Toy toy) 
    { 
    super(toy); 
    } 
} 
Class Toy 
{ 
    private static Toy toys = new Toy(); 
    Toy(){} 
    Toy(Toy toy) 
    { 
     toy = Toy.getInstance(); 
    } 
    public static Toy getInstance() 
    { 
    return toys; 
    } 
} 

및 중, 및 메소드도 가져와 비공개로 만드십시오!