C#Generic Parent Children定义

时间:2017-08-25 23:09:09

标签: c# generics design-patterns

我试图在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>
    {
    }
}

其中一个编译错误在行公共类Trunk

  

错误CS0311类型TestProject1.Root不能用作类型   泛型类型或方法中的参数TParent   ParentChild<TParent, TChild>。没有隐含的参考   从TestProject1.Root转换为   TestProject1.Parent<TestProject1.BaseElement>

但实际上有一条从RootParent<BaseElement>的路径,Root继承自Parent<Trunk>TrunkBaseElement,原因是BaseElements ParentChild继承自Branch的事实,Trunk是BaseElement的直接继承者。

其他编译错误类似,但适用于Trunk中的Leaf类型以及Branch的{​​{1}}和ORDER参数。

1 个答案:

答案 0 :(得分:1)

这不是来自>seqefsub(tmp, min.support=2, constraint = seqeconstraint(window.size = 2)) Subsequence Support Count 1 (A) 1.0000000 3 2 (B) 1.0000000 3 3 (C) 1.0000000 3 4 (A)-(B) 0.6666667 2 5 (A)-(C) 0.6666667 2 Computed on 3 event sequences Constraint Value window.size 2 count.method COBJ 的继承。如果这些类都不是从BaseElement派生的,那么你会遇到同样的问题。 BaseElement的类型定义取决于RootTrunk的类型定义取决于Trunk。你不能像C#中的泛型一样具有循环依赖。实际上,您正在尝试将Root定义为Root,因此Root派生自Root,这是一个问题。