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