【发布时间】:2017-04-21 11:23:43
【问题描述】:
我使用接口、继承和泛型用 c# 编写了以下代码:
public interface IBasic
{
}
public class Basic : IBasic
{
}
public class AnotherBasic : Basic
{
}
public interface IWorker<in TBasic>
{
void Run(TBasic basic);
}
public class Worker : IWorker<Basic>
{
public void Run(Basic basic)
{
throw new System.NotImplementedException();
}
}
public class AnotherWorker : IWorker<AnotherBasic>
{
public void Run(AnotherBasic basic)
{
throw new System.NotImplementedException();
}
}
public void Test()
{
List<IWorker<IBasic>> workers = new List<IWorker<IBasic>>
{
new Worker(),
new AnotherWorker()
};
}
这段代码的问题是worker和anotherworker类不适合IWorker<IBasic>的泛型列表,它们是worker和基本类的worker的父母。问题是 IWorker<in TBasic> 由于运行方法签名是逆变的,但是我需要它是协变的,以便填写 List<IWorker<IBasic>>。 run 方法必须具有 TBasic 参数,并且我需要此工作人员列表以用于责任链设计模式。我是否遗漏了什么,或者我是否找到了使协变和逆变不相互排斥的理由?
【问题讨论】:
-
你不能这样做,因为它不安全,例如
new List<IWorker<IBasic>>{new AnotherWorker()}[0].Run(new Basic())会编译但在运行时会失败。 -
这看起来像XYProblem。如果您描述了您要解决的实际问题,那么您尝试使用此设计解决的任何问题都可以通过不同的设计来解决。
-
我显然可以通过多种方法解决这个问题,但我希望它按照我展示的方式工作
标签: c# generics covariance contravariance