C# 抽象类的协方差模式

C# 抽象类的协方差模式,c#,C#,我现在意识到协方差在抽象类中是不可用的,但是无论如何,我可以在这里利用它,这样我就可以继续使用这个模式 基本上,我们希望能够创建第一个泛型参数的实例,并传递创建该对象本身的对象 以下操作将在运行时失败,因为无法针对泛型类型将SpecialProcessor分配给ProcessorBase 感谢您的建议 public class ProcessorUser<T> where T : ProcessorBase { public void ReceiveCommand()

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

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

以下操作将在运行时失败,因为无法针对泛型类型将SpecialProcessor分配给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)
    {
    }
}
公共类ProcessorUser其中T:ProcessorBase
{
public void ReceiveCommand()
{
Activator.CreateInstance(typeof(T),this);
}
}
公共抽象类ProcessorBase
{
受保护的ProcessorBase(ProcessorUser参数)
{
}
}
公共类特殊处理器:ProcessorBase
{
公共特殊处理器(ProcessorUser参数)
:基本(参数)
{
}
}

实际上,从您不太完整的代码示例来看,a)您正在尝试做什么,b)什么“在运行时失败”一点也不清楚。您没有显示任何调用
ReceiveCommand()
方法的代码,因此无法看到代码可能以何种方式失败

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

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(); }
}
接口IPProcessorUser其中T:ProcessorBase
{
void ReceiveCommand();
}
类ProcessorUser:IPProcessorUser,其中T:ProcessorBase
{
public void ReceiveCommand()
{
Activator.CreateInstance(typeof(T),this);
}
}
抽象类处理器数据库
{
受保护的ProcessorBase(IPProcessorUser参数)
{
}
}
类SpecialProcessor:ProcessorBase
{
私有IProcessorUser_参数;
公共专用处理器(IProcessorUser参数)
:基本(参数)
{
_param=param;
}
public void ReceiveCommand(){u param.ReceiveCommand();}
}
请注意,我将
ReceiveCommand()
方法添加到
SpecialProcessor
类中,以便在运行时看到执行的内容。事实上,有些东西确实起作用了。但我无法知道在你的场景中,这是否是你想要的。如果你想得到一个清晰、准确的答案,你必须提供清楚的信息,表明你正在尝试做什么,以及你在做这件事时遇到了什么困难


(顺便说一句,这实际上与
抽象
类没有任何关系。在您的代码示例中,除了类声明本身之外,实际上没有任何东西是
抽象
,一般原则适用于任何类,而不仅仅是
抽象
类).

对于一个显然不够清楚的问题,您可以提供一个有效的答案。谢谢。@Dave:很高兴能帮上忙。我猜了一猜……很高兴听到这是正确的,足以提供帮助!:)我认为这里的要点是,如果必须对调用类进行任何类型的引用。类本身必须实现一个共同变量接口。注意,在我的例子中,调用类继承自一个相当大的类。所以我将这个类作为属性添加到接口本身。