泛型子C#的通用父级

Ed *_*rty 6 c# generics design-patterns

我有一个父类Container可能包含任何类型的Node,其中Node是父类特有的泛型类的子类,如下所示:

public class ContainerBase<NodeType, ObjectType>
    where NodeType : NodeBase<ObjectType> where ObjectType : ObjectBase {
}

public abstract class NodeBase<T> where T : ObjectBase {
    ContainerBase<NodeBase<T>, T> container;
    public NodeBase(ContainerBase<NodeBase<T>, T> owner) {
        container = owner;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建具体的子类,以简化实现标准对象类型:

public class ContainerNormal : ContainerBase<NodeNormal, ObjectNormal> {
}

public class NodeNormal : NodeBase<ObjectNormal> {
    //This doesn't work
    public NodeNormal(ContainerNormal owner) : base(owner) { }
}
Run Code Online (Sandbox Code Playgroud)

我有点理解为什么对基础构造函数的调用不起作用.它试图将a转换为无效的ContainerNormala ContainerBase<NodeBase<ObjectNormal>, ObjectNormal>.

那么我错过了哪些设计模式才能使这项工作正常进行?或者我只需要在ContainerBase<NodeBase<ObjectNormal>,ObjectNormal>构造函数中接受一个,即使它可能不一定是一个ContainerNormal对象?

eul*_*rfx 3

探索:协变和逆变,但这应该有效:

public class Container<TNode, T> where TNode : Node<T> { }

public abstract class Node<T>
{
    Container<Node<T>, T> container;

    public Node(Container<Node<T>, T> owner)
    {
        this.container = owner;
    }
}

public class ContainerNormal<T> : Container<Node<T>, T> { }

public class NodeNormal<T> : Node<T>
{
    public NodeNormal(ContainerNormal<T> container)
        : base(container)
    {
    }
}

public class ContainerNormal : ContainerNormal<string> { }

public class NodeNormal : NodeNormal<string>
{
    public NodeNormal(ContainerNormal container)
        : base(container)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)