2017-10-18 3 views
0

私はこれのための実用的な解決策を持っていますが、私は事を複雑にするかどうか分かりません。子と親を確実にするインターフェースを定義する方法は、定義されたインターフェースと同じタイプのものです

は、私たちは、次の2つのインタフェースを持っていると言う:

public interface IPrototype 
{ 
    Guid Id { get; set; } 
    string Name { get; set; } 
} 

public interface IHierarchicalPrototype : IPrototype 
{ 
    IHierarchicalPrototype Parent { get; set; } 
    IList<IHierarchicalPrototype> Children { get; set; } 
} 

は今IHierarchicalPrototypeの多くの実装は、例えば、存在すると仮定しますIEntityPrototypeまたはIFieldPrototype。上記の定義で

ParentはどのIHierarchicalPrototypeIEntityPrototypeさんはChildrenリストがどのIHierarchicalPrototypeが含まれている可能性がある可能性があります。

確かに私が確認したかったのは、IHierarchicalPrototypeには独自のタイプの子のみを含めることができるということです。だから、IEntityPrototypeChildrenはタイプIList<IEntityPrototype>であり、ParentはタイプIEntityPrototypeです。

IHierarchicalPrototypeから派生するすべてのプロトタイプに対してChildrenParentを実装するのが1つの解決策ですが、より簡単な方法が必要です。

私が思いついたのは、ジェネリックの解決策です。代わりに、私はこのようなジェネリックでそれを定義することができ

interface IEntityPrototype : IHierarchicalPrototype {} 

を定義する

:私は冗長なジェネリック型パラメータを取り除くことはできません

interface IEntityPrototype : IHierarchicalPrototype<IEntityPrototype> 

。私は、ジェネリック型パラメータは常に私は現在定義していますインターフェイスを一致させるために、私は一般的な定義もここに(私はしないでください)このようなミックスプロトタイプ

// this will never happen! 
interface IEntityPrototype : IHierarchicalPrototype<IFieldPrototype> 

を望んでいた場合、実際にのみ、上記が必要になりたいですIHierarchicalPrototypeインタフェース

public interface IHierarchicalPrototype<THierarchical> : IPrototype 
    where THierarchical : IHierarchicalPrototype<THierarchical> 
{ 
    IHierarchicalPrototype<THierarchical> Parent { get; } 
    IList<IHierarchicalPrototype<THierarchical>> Children { get; } 
} 

あなたが思い付くことができます任意の代替またはよりエレガントなソリューションの?

+2

あなたはエリックリペットの[Curiouserとcuriouser]を読むことをお勧めします(HTTPS://blogs.msdn.microso "Curiously Recurring Template Pattern"について議論し、C#でどのようにしたいのか、それがどうしてうまくいかないのかについて議論しているft/iterericert/2011/02/03/curiouser- and-curiouser/ –

+0

@Damien_The_Unbelieverうわー、それはとても速かったです。このためにありがとう、私は実装したことが実際にパターンであることを知らなかった。非常に洞察力のある。私の実装の将来のメリットがその不利益を上回るかどうか、私は確かに自分自身に尋ねました。私はこのパターンの欠点が何であるかをはっきりと見ることはできませんでしたが、なぜ今は理解できるのですか。あなたがより徹底的な答えを書くなら、私はそれを喜んで受け入れます。 –

+0

強制できないものがいくつかあります.... –

答えて

0

私は今、私が実施しているが実際couriously recurring template pattern(CRTP)と呼ばれるパターンであることを知っている@Damien_The_Unbelieverに感謝します。

Eric LippertZp Bappiは、両方に興味がある人にはこれについて書いています。

実際にこのパターンを使用すると、実際にはC#でモデル化するのが難しい方法で問題が解決されることがあります。[...]人々がこれをやりたい理由の1つとして、型階層における特定の制約。

この正確な理由は、私のコードで達成しようとしているものです。

CRTPについての私の疑問は、Lippertの記事でも言及されています。彼は、それは実際にあなたが、これは単にそれからです

  • をすると思うの制約を強制することはありませんので、あなたがC#の

    1. で好奇心旺盛なパターン のこの種を実装する前に、非常に難しいと思いますし

      をアドバイスコード

    を読み込み、誰の麺を焼く
  • 0

    私があなたが求めていることを理解すれば、これは助けになるかもしれません。

    public interface IPrototype 
    { 
        Guid Id { get; set; } 
        string Name{ get; set; } 
    } 
    
    public interface IHierarchicalPrototype<T> : IPrototype where T:IPrototype 
    { 
        T Parent{ get; } 
        IList<T> Children { get; } 
    } 
    
    +0

    これは正しくありません。 'IEntityPrototypeインタフェース:IHierarchicalPrototype 'は 'IPrototype'の子を' Children'に追加することを可能にします。私はその子どもたちが排他的にIEntityPrototype型になって欲しいです。 –

    関連する問題