我有一个父类容器,它可以包含任何类型的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;
    }
}

我要做的是创建简单的具体子类来实现标准对象类型:
public class ContainerNormal : ContainerBase<NodeNormal, ObjectNormal> {
}

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

我有点理解为什么对基本构造函数的调用不起作用。它正在尝试将ContainerNormal转换为实际上不起作用的ContainerBase<NodeBase<ObjectNormal>, ObjectNormal>

那么,我错过了哪种设计模式才能使这项工作正确进行?或者,即使不一定是ContainerBase<NodeBase<ObjectNormal>,ObjectNormal>对象,我是否也必须在构造函数中使用ContainerNormal

最佳答案

探索:Covariance and contravariance,但这应该可以工作:

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)
    {
    }
}

10-07 18:01