家长/儿童仿制药关系

时间:2013-05-31 00:19:11

标签: c# c#-4.0 generics parent-child

所以,我正试图建立这样的父/子类关系:

class ParentClass<C, T> where C : ChildClass<T>
{
    public void AddChild(C child)
    {
        child.SetParent(this); //Argument 1: cannot convert from 'ParentClass<C,T>' to 'ParentClass<ChildClass<T>,T>'
    }
}
class ChildClass<T>
{
    ParentClass<ChildClass<T>, T> myParent;
    public void SetParent(ParentClass<ChildClass<T>, T> parent)
    {
        myParent = parent;
    }
}

但是,这是一个编译错误。所以,我的第二个想法是用SetParent声明where方法。但问题是我不知道什么类型声明myParent(我知道类型,我只是不知道如何声明它。)

class ParentClass<C, T> where C : ChildClass<T>
{
    public void AddChild(C child)
    {
        child.SetParent(this);
    }
}
class ChildClass<T>
{
    var myParent; //What should I declare this as?
    public void SetParent<K>(ParentClass<K,T> parent) where K : ChildClass<T>
    {
        myParent = parent;
    }
}

1 个答案:

答案 0 :(得分:4)

这似乎是编译,虽然它是相当头发的:

class ParentClass<C, T> where C : ChildClass<C, T>
{
    public void AddChild(C child)
    {
        child.SetParent(this);
    }
}
class ChildClass<C, T> where C : ChildClass<C, T>
{
    ParentClass<C, T> myParent;
    public void SetParent(ParentClass<C, T> parent)
    {
        myParent = parent;
    }
}

此解决方案使用递归绑定的类型参数,近似“自我类型”。

我有义务链接到Eric Lippert关于此模式的文章:Curiouser and curiouser