私はJavaでサブクラスをクローンする必要がありますが、これが発生するコードのポイントでは、サブクラスの型はわかりません。スーパークラスのみです。これを行うための最良のデザインパターンは何ですか?Javaでサブクラスをクローニングする
例:
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'が上書きされます(' @ Override'でチェックされます)。 'Foo.copy'。 –
トムが正しいです。 'copy'の呼び出しは実行時に行われ、JVMはオブジェクトの型に基づいて適切な' copy'メソッドを呼び出します。 –