我有一个父类容器,它可能包含任何类型的节点,其中节点是特定于父类的通用类的子类,如下所示:
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)
{
}
}
关于c# - 通用子 C# 的通用父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251004/