c# - 通用子 C# 的通用父级

标签 c# design-patterns generics

我有一个父类容器,它可能包含任何类型的节点,其中节点是特定于父类的通用类的子类,如下所示:

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

我有点理解为什么对基本构造函数的调用不起作用。它正在尝试转换 ContainerNormalContainerBase<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/

相关文章:

php - 中间件生成的新对象放在哪里?

c++ - 以下抽象工厂设计模式的实现是否正确?

python - python如何在其中找到装饰函数?

java - 使用类参数时,类型绑定(bind)不是通过构造函数推断的吗?

c# - 我们应该在 C++ 中使用装饰器模式吗?

C#,System.Timers.Timer,每分钟与系统时钟同步运行

c# - 在 Xamarin 中使用 SQLite 数据库的 C# 类中的另一个泛型中使用泛型类型

java - 什么是泛型方法,在这种情况下 <T> 是如何绑定(bind)的?

c# - Webbrowser.DocumentStream 或 Webbrowser.DocumentText 不工作?

c# - 如何在ListView中对内容进行排序?