我有一个Company
包含不同列表的类IFactory<IPart>
;例如一个EngineFactory
.
public class Company
{
private Dictionary<Type, IFactory<IPart>> _factories;
public Company()
{
_factories = new Dictionary<Type, IFactory<IPart>>();
_factories[typeof (Engine)] = new EngineFactory();
}
public void SendOrderIntakeToFactory(IPart part)
{
}
}
EngineFactory
看起来像这样:
public class EngineFactory : IFactory<Engine>
{
public void Produce(Engine part)
{
}
}
和IFactory
界面:
public interface IFactory<T> where T : IPart
{
void Produce(T part);
}
这将导致编译器错误:
无法将类型“EngineFactory”隐式转换为“IFactory”。存在显式转换(您是否缺少演员表?)
在这条线上:_factories[typeof (Engine)] = new EngineFactory();
好的,这对我来说很有意义,如果不指定方差,这将永远不会起作用。所以我尝试将out
关键字添加到泛型类型T
,但这将迫使我删除T
as 方法参数(因为它不允许<out T>
用作输入参数):
public interface IFactory<out T> where T : IPart
{
void Produce(IPart part);
}
这显然打破了我的通用设计。我能够Wheel
在我的EngineFactory
.
我理解挑战在于这两个要求:
- 将工厂存储为
IFactory<IPart>
void Produce(T part);
在工厂中需要一个通用的实现。
有没有办法做到这一点?