所以我有一個工作的解決方案,但我只是不確定我是否過於複雜。如何定義一個接口,以確保它的孩子和父母是與定義的接口相同的類型
假設我們有以下兩個接口:
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
但有如此一個簡單的方法!
我想出的是一個有泛型的解決方案。
而不是定義
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; }
}
您可以想出任何替代或更優雅的解決方案?
您可能需要閱讀埃裏克利珀的[奇妙而又奇妙(HTTPS://blogs.msdn.microso ft.com/ericlippert/2011/02/03/curiouser-and-curiouser/),它討論了「奇怪的循環模板模式」,以及它爲什麼不能在C#中使用它。 –
@Damien_The_Unbeliever哇,那*非常*快。非常感謝,我不知道我所實施的實際上是一種模式。非常有見地。我的確在問自己,我的實施在未來的好處是否會超過它的缺點。雖然我看不出這種模式的全部垮臺,但我現在可以理解爲什麼。如果你寫出更徹底的答案,我會很樂意接受它。 –
有些事情你不能執行.... –