3

すべて共通のスーパークラス (「マネージド」) に根ざしたオブジェクトのコレクションを管理するクラス (「マネージャー」) があります。マネージャー クラスは、選択された管理対象オブジェクトのコピーを作成する必要がある場合がありますが、それが 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に対する一般的な怒りと憎しみにもかかわらず、それは私がやりたいことをするための最良の方法であるようです. 何か不足していますか?

4

3 に答える 3

0

Clone の能力は、コピー コンストラクターが適していない継承と連動する実行時の動的動作に由来します。

オブジェクトを複製可能にする標準的な方法は次のとおりです。

  1. クローン可能を実装する
  2. オーバーライドclone()して公開する
  3. 内で、 Managed obj = (Managed) super.clone();clone()を呼び出します。super.clone()
  4. オブジェクトのクローンは、すべてのフィールドの単純なメモリ コピーを行います。これは、プリミティブと不変オブジェクトへの参照には問題ありません。可変オブジェクトの場合、必要に応じてクローン/コピーする必要があります

が継承され、サブクラスが clone を適切に実装している場合Managed、それを複製すると適切な型が返されます。例えば

Managed m = new SubTypeOfManaged();
m.clone(); // returns a cloned SubTypeOfManaged
于 2015-11-17T00:36:44.780 に答える