私はこれのための実用的な解決策を持っていますが、私は事を複雑にするかどうか分かりません。子と親を確実にするインターフェースを定義する方法は、定義されたインターフェースと同じタイプのものです
は、私たちは、次の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
はどのIHierarchicalPrototype
とIEntityPrototype
さんはChildren
リストがどのIHierarchicalPrototype
が含まれている可能性がある可能性があります。
確かに私が確認したかったのは、IHierarchicalPrototype
には独自のタイプの子のみを含めることができるということです。だから、IEntityPrototype
のChildren
はタイプIList<IEntityPrototype>
であり、Parent
はタイプIEntityPrototype
です。
IHierarchicalPrototype
から派生するすべてのプロトタイプに対してChildren
とParent
を実装するのが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; }
}
あなたが思い付くことができます任意の代替またはよりエレガントなソリューションの?
あなたはエリックリペットの[Curiouserとcuriouser]を読むことをお勧めします(HTTPS://blogs.msdn.microso "Curiously Recurring Template Pattern"について議論し、C#でどのようにしたいのか、それがどうしてうまくいかないのかについて議論しているft/iterericert/2011/02/03/curiouser- and-curiouser/ –
@Damien_The_Unbelieverうわー、それはとても速かったです。このためにありがとう、私は実装したことが実際にパターンであることを知らなかった。非常に洞察力のある。私の実装の将来のメリットがその不利益を上回るかどうか、私は確かに自分自身に尋ねました。私はこのパターンの欠点が何であるかをはっきりと見ることはできませんでしたが、なぜ今は理解できるのですか。あなたがより徹底的な答えを書くなら、私はそれを喜んで受け入れます。 –
強制できないものがいくつかあります.... –