我有一个泛型类,比如MyCollection< T>,需要它的泛型类型T有一个无参数构造函数。我有一个接口IMyInterface,所有实现都有无参数构造函数,但我无法告诉编译器,所以我不能使用IMyInterface作为类型参数T.我该怎么办?
public class MyCollection<T> where T : new()
{
bla bla ...
T t = new T();
}
public interface IMyInterface
{
bla bla ...
}
...
MyCollection<IMyInterface> x; //Compile Time Error
我知道在Interface defining a constructor signature?中提出了几乎相同的问题,但它已经两年了,我希望也许有人可以在C#4.0中建议解决方法。
答案 0 :(得分:3)
这不起作用,因为T t = new T();
接口为T,它将变为IMyInterface t = new IMyInterface();
,这完全无效。您必须知道构造类型的具体实现。您不能单独使用抽象类型或界面。如果你在构造函数中添加一个参数来在构造函数中添加一个参数,通过传入你的具体实现并删除新的参数约束并使用接口作为泛型参数,那么MyCollection就是你自己的类。
答案 1 :(得分:1)
处理泛型类的另一种方法是必须能够构造泛型类型的东西,但由于某种原因不能使用New约束,要么将工厂传递给必须创建新对象的方法。泛型类型,或者要求作为接口的一部分,实现它的类提供了创建另一个实例的方法。例如,第一种用法可以定义接口IFactoryFromString&lt; T&gt;。其中包括一个方法“T CreateFromString(String st)”,并将这样的工厂传递给一个例程,该例程需要能够创建给定字符串的T.例如,对于第二种用法的示例,用于表现为树节点的东西的接口可以包括用于创建另一个类似树节点的方法。第二种用法避免了对额外工厂类和参数的需要,但要求实际上有一个类的实例满足约束以生成另一个。