我有一个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,但这将迫使我删除Tas 方法参数(因为它不允许<out T>用作输入参数):
public interface IFactory<out T> where T : IPart
{
void Produce(IPart part);
}
这显然打破了我的通用设计。我能够Wheel在我的EngineFactory.
我理解挑战在于这两个要求:
- 将工厂存储为
IFactory<IPart> void Produce(T part);在工厂中需要一个通用的实现。
有没有办法做到这一点?