すべて共通のスーパークラス (「マネージド」) に根ざしたオブジェクトのコレクションを管理するクラス (「マネージャー」) があります。マネージャー クラスは、選択された管理対象オブジェクトのコピーを作成する必要がある場合がありますが、それが Managed のどのサブクラスであるかを知る方法はありません。これを行うための最良の方法は (それだけではないにしても) Cloneable を使用することだと私には思えます。次に、コピーする必要があるマネージド オブジェクトに対して、managedObject.clone() を呼び出します。もちろん、適切に実装する必要があります。「コピーコンストラクターを使用するだけ」またはすべてのサブクラスに myManagedSubClass.copy() メソッドを実装するようにという多くの警告を読みました。タイプを知る必要があるため、「実際の」コピーコンストラクターの使用方法がわかりません。
ManagedSubclass copiedObject = new ManagedSubclass(existingManagedSubclassObject);
copy() メソッドを実装すると、次のようになると思います。
class Managed {
public Managed copy() {
Managed newObject = new Managed(Managed other);
// fixup mutable fields in newObject
}
}
しかし、私の使用法では、戻り値を期待される型にキャストする必要があります。すべての Managed サブクラスに copy() を実装するのを忘れていた場合、サブクラス型にキャストされたスーパークラスになってしまいます。直接コピーに有効なクラスであるため、Managed でコピー保護された可視性を作成できません。そうでない場合でも、コピー可能なすべてのサブクラスにコピーを実装し、可変フィールドのディープ コピーを処理するすべての機構を実装するか、すべてを処理する共通名の保護されたメソッドの独自のプロトコルを確立する必要があります。そのレベルのスーパークラスによって導入された可変フィールド。
Cloneableに対する一般的な怒りと憎しみにもかかわらず、それは私がやりたいことをするための最良の方法であるようです. 何か不足していますか?