2011-06-08 69 views
2

我有一个泛型类,比如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中的解决方法。

回答

3

这将不起作用,因为T t = new T();与接口为T,它会变成IMyInterface t = new IMyInterface();这是完全无效的。你必须知道构造你的类型的具体实现是什么。你不能单独使用抽象类型或接口。如果您在构造函数中添加了一个参数,在构造函数中设置T t,则MyCollection是您自己的类,方法是传入具体实现并删除新参数约束,然后将该接口用作通用参数。

+0

好主意,我会那样做的。谢谢! – 2011-06-08 13:08:00

1

处理泛型类的另一种方法是必须能够构造泛型类型的东西,但无论出于何种原因使用New约束都无法将工厂传递给必须创建新对象的方法泛型类型,或者作为接口的一部分,实现它的类提供了创建另一个实例的方法。例如第一种用法,可以定义一个接口IFactoryFromString <T>其中包括一个方法“T CreateFromString(String st)”,并将这样一个工厂传递给需要能够创建一个给定字符串的T的例程。例如,对于第二种用法的示例,某些表现为树节点的接口可能包含一种方法来创建另一个类似的树节点。第二种用法避免了额外工厂类和参数的需要,但要求实际上有一个类的实例满足约束条件以产生另一个约束。

相关问题