抽象类的协方差模式

时间:2015-02-22 00:08:49

标签: c#

我现在意识到协方差在抽象类中是不可用的,但无论如何我都可以在这里使用它,以便我可以继续使用这种模式。

基本上希望能够创建第一个泛型参数的实例并传递创建该对象本身的对象。

以下内容将在运行时失败,因为无法将GeneralProcessor分配给ProcessorBase而非泛型类型。

感谢任何建议。

public class ProcessorUser<T> where T : ProcessorBase
{
    public void ReceiveCommand()
    {
        Activator.CreateInstance(typeof (T), this);
    }
}

public abstract class ProcessorBase
{
    protected ProcessorBase(ProcessorUser<ProcessorBase> param)
    {
    }
}

public class SpecialProcessor : ProcessorBase
{
    public SpecialProcessor(ProcessorUser<ProcessorBase> param)
        : base(param)
    {
    }
}

1 个答案:

答案 0 :(得分:1)

实际上,从你不完整的代码示例中,它根本不清楚a)你想要做什么,以及b)什么&#34;在运行时失败&#34;。您没有显示任何调用ReceiveCommand()方法的代码,因此无法查看代码可能以何种方式失败。

也就是说,在C#中获取方差的通常方法是通过委托或接口类型。因此,您可以声明由ProcessorUser<T>实现的协变接口,然后在构造函数声明中使用该接口而不是实际类型。例如:

interface IProcessorUser<out T> where T : ProcessorBase
{
    void ReceiveCommand();
}

class ProcessorUser<T> : IProcessorUser<T> where T : ProcessorBase
{
    public void ReceiveCommand()
    {
        Activator.CreateInstance(typeof(T), this);
    }
}

abstract class ProcessorBase
{
    protected ProcessorBase(IProcessorUser<ProcessorBase> param)
    {
    }
}

class SpecialProcessor : ProcessorBase
{
    private IProcessorUser<SpecialProcessor> _param;

    public SpecialProcessor(IProcessorUser<SpecialProcessor> param)
        : base(param)
    {
        _param = param;
    }

    public void ReceiveCommand() { _param.ReceiveCommand(); }
}

请注意,我已将ReceiveCommand()方法添加到SpecialProcessor类,因此我可以在运行时看到某些内容。事实确实有效。但是我无法知道在你的场景中,这是你想要发生的事情。如果您想要清楚,准确地回答这方面的问题,您必须提供a good, minimal, complete code example清楚地显示您正在尝试做什么以及您正在做什么困难。

(顺便说一句,这与abstract类没有任何关系。在您的代码示例中,除了abstract之外,甚至没有任何内容。类声明本身,一般原则适用于任何类,而不仅仅是abstract个。