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对象?
探索:协变和逆变,但这应该有效:
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)