クローン作成方法を適切に継承するにはどうすればよいですか?

フロリアン

基本クラス(A)と配信済みクラス()がありBます。それらはICloneable<>私が作っ一般的なインターフェースを継承します:

interface ICloneable<T>
{
    T Clone();
}

A.Clone()メソッドをオーバーライドしたいのですBが、そのため、ではなくB.Clone()タイプのオブジェクトが返されますが、オーバーライドしても許可されません。BA

私にはある種の回避策がありますが、それは本当に醜いです:

class A : ICloneable<A>
{
    virtual A Clone() => /*magic*/;
}
class B : A, ICloneable<B>
{
    B CloneAsB() => /*other kind of magic*/;
    override A Clone() => CloneAsB();
}

(非ジェネリックの明示的な実装も追加しましICloneableたが、例では示していません。)

偽のクローンメソッドを使用せずに、これを実現するためのより良い方法はありますか?

フロリアン

より良い回避策を見つけました。次に示すようにICloneable<A>.Clone()、非ジェネリックを使用してジェネリックメソッドの呼び出しを継承階層に渡すICloneable.Clone()と便利な場合があります。

class A : ICloneable<A>, ICloneable
{
    A Clone() => (A) ((ICloneable) this).Clone(); //This will call ICloneable.Clone in class B if the type of the object is B!

    //If object is of type B, not this but the derived method is called:
    object ICloneable.Clone() => /*Cloning, if object is an instance of A*/;
}
class B : A, ICloneable<B>
{
    new B Clone() => (B) ((ICloneable) this).Clone(); //This will call ICloneable.Clone in a derived type if object is of more derived type!

    //If object is of even more derived type, not this but the method of the derived class is called:
    object ICloneable.Clone() => /*Cloning, if object is an instance of B*/;
}
//Same implementation for class C...

これには、どのメソッドもオブジェクトの型を明示的にチェックする必要がないという利点があります(つまり、クラス内AClone()は、オブジェクトが型であるかどうかをチェックする必要はありませんB)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

継承または別のアプローチを使用してPOJOを適切に構成するにはどうすればよいですか?

分類Dev

Typescriptで適切な方法で動的にクラスを作成するにはどうすればよいですか?

分類Dev

継承されるデータクラスにオプションのフィールドを作成するにはどうすればよいですか?

分類Dev

ジェネリックと継承を適切に混合して、望ましい結果を得るにはどうすればよいですか?

分類Dev

F#でインターフェイスを継承する抽象クラスを作成するにはどうすればよいですか?

分類Dev

継承可能なクラス変数を作成するにはどうすればよいですか?

分類Dev

継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

分類Dev

トランクからSVNタグを適切に作成するにはどうすればよいですか?

分類Dev

多重継承を使用してDjangoフォームを作成するにはどうすればよいですか?

分類Dev

AEM 6.2でページプロパティを継承するにはどうすればよいですか?

分類Dev

ロールの特権を継承するにはどうすればよいですか?

分類Dev

テンプレートとユニオンを継承するにはどうすればよいですか?

分類Dev

Python:他のABCから継承するABCを作成するにはどうすればよいですか?

分類Dev

Cheetahテンプレートで継承を使用するにはどうすればよいですか?

分類Dev

C ++でメンバー関数のみを継承するにはどうすればよいですか?

分類Dev

Javaで@JsonFormatアノテーションを継承するにはどうすればよいですか?

分類Dev

クエリ生成トークンを適切に使用するにはどうすればよいですか?

分類Dev

継承チェーンを実現するにはどうすればよいですか?

分類Dev

jqueryセレクターを適切にチェーンするにはどうすればよいですか?

分類Dev

グループボックスコントロールにパディングを適切に適用するにはどうすればよいですか?

分類Dev

JavaScript関数を継承するにはどうすればよいですか?

分類Dev

DataGridColumnsを継承するにはどうすればよいですか

分類Dev

Visioで多重継承矢印の関係を作成するにはどうすればよいですか?

分類Dev

ローカル文字を適切にフィルタリングするNSPredicateを作成するにはどうすればよいですか?

分類Dev

多くのクローンを回避するために文字列をより適切に保存するにはどうすればよいですか?

分類Dev

継承を含むArrayListsにプロパティを追加するにはどうすればよいですか?

分類Dev

銀行口座コードのより適切でクリーンなバージョンを作成するにはどうすればよいですか?

分類Dev

Kotlin:「静的な」継承可能な関数を作成するにはどうすればよいですか?

分類Dev

JavaScriptでonclickイベントを適切に作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    継承または別のアプローチを使用してPOJOを適切に構成するにはどうすればよいですか?

  2. 2

    Typescriptで適切な方法で動的にクラスを作成するにはどうすればよいですか?

  3. 3

    継承されるデータクラスにオプションのフィールドを作成するにはどうすればよいですか?

  4. 4

    ジェネリックと継承を適切に混合して、望ましい結果を得るにはどうすればよいですか?

  5. 5

    F#でインターフェイスを継承する抽象クラスを作成するにはどうすればよいですか?

  6. 6

    継承可能なクラス変数を作成するにはどうすればよいですか?

  7. 7

    継承するときに基本クラスのコピーを作成しないようにするにはどうすればよいですか?C ++

  8. 8

    トランクからSVNタグを適切に作成するにはどうすればよいですか?

  9. 9

    多重継承を使用してDjangoフォームを作成するにはどうすればよいですか?

  10. 10

    AEM 6.2でページプロパティを継承するにはどうすればよいですか?

  11. 11

    ロールの特権を継承するにはどうすればよいですか?

  12. 12

    テンプレートとユニオンを継承するにはどうすればよいですか?

  13. 13

    Python:他のABCから継承するABCを作成するにはどうすればよいですか?

  14. 14

    Cheetahテンプレートで継承を使用するにはどうすればよいですか?

  15. 15

    C ++でメンバー関数のみを継承するにはどうすればよいですか?

  16. 16

    Javaで@JsonFormatアノテーションを継承するにはどうすればよいですか?

  17. 17

    クエリ生成トークンを適切に使用するにはどうすればよいですか?

  18. 18

    継承チェーンを実現するにはどうすればよいですか?

  19. 19

    jqueryセレクターを適切にチェーンするにはどうすればよいですか?

  20. 20

    グループボックスコントロールにパディングを適切に適用するにはどうすればよいですか?

  21. 21

    JavaScript関数を継承するにはどうすればよいですか?

  22. 22

    DataGridColumnsを継承するにはどうすればよいですか

  23. 23

    Visioで多重継承矢印の関係を作成するにはどうすればよいですか?

  24. 24

    ローカル文字を適切にフィルタリングするNSPredicateを作成するにはどうすればよいですか?

  25. 25

    多くのクローンを回避するために文字列をより適切に保存するにはどうすればよいですか?

  26. 26

    継承を含むArrayListsにプロパティを追加するにはどうすればよいですか?

  27. 27

    銀行口座コードのより適切でクリーンなバージョンを作成するにはどうすればよいですか?

  28. 28

    Kotlin:「静的な」継承可能な関数を作成するにはどうすればよいですか?

  29. 29

    JavaScriptでonclickイベントを適切に作成するにはどうすればよいですか?

ホットタグ

アーカイブ