2017-08-25 62 views
0

我試圖設計在C#中的父母/子女的定義,但收到一些編輯錯誤,這是不明確的對我說:C#泛型單親家庭子女的定義

namespace TestProject1 
{ 
    public abstract class BaseElement 
    { 
    } 

    public abstract class Child<T> : BaseElement 
    { 
     public BaseElement Parent { get; set; } 
    } 

    public abstract class Parent<T> : BaseElement 
    { 
     public IQueryable<BaseElement> Children { get; set; } 
    } 

    public abstract class ParentChild<TParent, TChild> : BaseElement 
     where TParent : Parent<BaseElement> 
     where TChild : Child<BaseElement> 
    { 
     public void AddChild(TChild child) 
     { 
      child.Parent = this; 
     } 
    } 

    public class Root : Parent<Trunk> 
    { 
    } 

    public class Trunk : ParentChild<Root, Branch> 
    { 
    } 

    public class Branch : ParentChild<Trunk, Leaf> 
    { 
    } 

    public class Leaf : Child<Branch> 
    { 
    } 
} 

一個編譯錯誤的是線公共類中繼線

錯誤CS0311類型TestProject1.Root不能被用作類型 參數TParent在通用類型或方法 ParentChild<TParent, TChild> 。沒有隱含的參考 轉換從TestProject1.RootTestProject1.Parent<TestProject1.BaseElement>

但實際上是由於從RootParent<BaseElement>作爲Root繼承Parent<Trunk>TrunkBaseElement的路徑,從ParentChildBaseElements繼承,這是從BaseElement的直接繼任者。

其他的編譯錯誤是相似的,但對於TrunkBranch類型和BranchTrunkLeaf參數。

+0

C#不支持方差類。因此,無論「Trunk」和「BaseElement」之間的關係如何,「Parent 」不是「Parent 」。 – PetSerAl

回答

1

這不是從BaseElement在這裏打球的繼承。如果這些類中沒有一個派生自BaseElement,那麼您會遇到同樣的問題。的Root類型定義取決於Trunk。的Trunk類型定義取決於Root。你不能像C#中的泛型那樣產生循環依賴。有效地你試圖定義根爲Root<Parent<ParentChild<Root, Branch>>>所以尋根根,這是一個問題派生的。