자바에서 서브 클래스를 복제해야하지만, 코드가 발생하는 지점에서 서브 클래스 유형은 알 수 없으며 수퍼 클래스 만 알 수 있습니다. 이 작업을 수행하는 데 가장 적합한 디자인 패턴은 무엇입니까?자바에서 서브 클래스 복제하기
예 :
이class Foo {
...
public Foo copy() {
return new Foo(this);
}
}
class Bar extends Foo {
...
@Override public Bar copy() {
return new Bar(this);
}
}
(이상적 클래스는 추상적 인 또는 효과적으로 중 하나를합니다
class Foo {
String myFoo;
public Foo(){}
public Foo(Foo old) {
this.myFoo = old.myFoo;
}
}
class Bar extends Foo {
String myBar;
public Bar(){}
public Bar(Bar old) {
super(old); // copies myFoo
this.myBar = old.myBar;
}
}
class Copier {
Foo foo;
public Foo makeCopy(Foo oldFoo) {
// this doesn't work if oldFoo is actually an
// instance of Bar, because myBar is not copied
Foo newFoo = new Foo(oldFoo);
return newFoo;
// unfortunately, I can't predict what oldFoo's the actual class
// is, so I can't go:
// if (oldFoo instanceof Bar) { // copy Bar here }
}
}
아니요, 작동하지 않습니다. 시도해보십시오 : Bar bar = new Bar(); Foo foo = bar; foo.copy(). Bar가 아닌 Foo.copy()를 호출합니다.복사() – ccleve
@ user237815 나는 그렇게 생각하지 않는다. 'Bar.copy'가'Foo.copy'를 오버라이드합니다 ('@ Override'로 체크). –
톰이 맞습니다. 'copy'의 호출은 런타임에 발생하고 JVM은 객체의 유형에 따라 적절한'copy' 메소드를 호출합니다. –