【发布时间】:2016-04-27 12:46:51
【问题描述】:
我有一个通用的基类。 我有一个实现基类的具体类。
如何创建工厂类/方法来交付不同类型的具体类?
这里是一个例子:
public class ReceiverBase<T>
where T : IInterpreter
{ ... }
public class SpecialReceiver : ReceiverBase<OwnInterpreter> { ... }
public class ReceiverFactory<T>
where T : ReceiverBase<IInterpreter>, new()
public T Create(string type) {
switch(type) {
default:
return new SpecialReceiver();
}
}
}
问题在于 ReceiverBase 似乎不可能,因为编译器只希望类作为约束,而不是接口。 第二个问题是我无法将 SpecialReceiver 转换为 T。
那么有没有办法让它工作?
=== 编辑:根据第一个答案添加示例 ===
public interface IInterpreter
{
}
public class OwnInterpreter : IInterpreter
{
public void Dispose()
{
throw new NotImplementedException();
}
public void DoSomething() { }
}
public abstract class ReceiverBase<T>
where T : IInterpreter
{
public T MyReceiver { get; set; }
internal abstract void Start();
}
public class SpecialReceiver<T> : ReceiverBase<T>
where T : IInterpreter, new()
{
public void CheckSomething()
{
MyReceiver.DoSomething();
}
internal override void Start()
{
MyReceiver = new T();
}
}
public class ReceiverFactory<T>
where T : IInterpreter, new()
{
public static ReceiverBase<T> Create(string type)
{
switch (type)
{
default:
return new SpecialReceiver<T>();
}
}
}
问题是:MyReceiver.DoSomething();不管用。
此外,我必须像这样给工厂打电话:ReceiverFactory<OwnInterpreter>.Create(""); 我想这样:ReceiverFactory.Create("SpecialReceiver");
【问题讨论】:
-
您的第一条评论根本不是真的。您当然可以将接口作为约束。但是,您可能会遇到的是,因为您希望能够
newup 受约束类型的实例,所以您必须像您一样包含new()约束。 -
Compiler 说:IInterpreter 类型必须有一个公共的无参数构造函数才能将其用作参数 T。Compiler 引用此行: where T : ReceiverBase
, new() -
好的,我更正了。您可以将接口作为约束,但在这种情况下您不能,因为您想使用
new(),并且您必须保证所述构造函数存在。接口不保证构造函数。 -
是的,你是对的。 new() 约束是第一个错误的问题。