是否可以将泛型类型约束到Interface,new()?

时间:2014-08-06 14:16:34

标签: c# generics interface constructor constraints

我正在尝试创建一个简单的对象回收类

public class ObjectPool<T> where T : class, IRecyclable, new()
{
}

我希望能够在界面中使用它:

public interface ISomeInterface : IRecyclable
{
}

ObjectPool<ISomeInterface> pool = new ObjectPool<ISomeInterface>();

但这会产生错误:

error CS0310: The type `ISomeInterface' must have a public parameterless constructor in order to use it as parameter `T' in the generic type or method `ObjectPool<T>'

根据我在线阅读的内容,我知道我无法在界面中指定构造函数。

我已经读过你可以使用反射代替“new”来创建一个新实例,尽管我担心执行这个实例化的速度。

解决这种情况的正确方法是什么?有一个更简单的解决方案,我完全忽视了吗?

3 个答案:

答案 0 :(得分:2)

您无法在那里提供界面。 classnew要求它是可构造的引用类型。

答案 1 :(得分:2)

接口只能实现其他接口。

interface IA : IB, IC
{
    ...
}

解决困境的一个好方法是引入工厂界面。

interface IThing
{
    ...
}

interface IThingFactory
{
    IThing Create();
}

现在任何想要创造事物的人都应该为此目的获得IThingFactory

如果您需要工厂的通用概念,可以使用以下内容:

interface IFactory<T>
{
    T Create();
}

class ObjectPool<T, F>
    where T : IRecyclable        
    where F : IFactory<T>
{
    public ObjectPool(F factory)
    {
        ...
    }
}

答案 2 :(得分:0)

您无法构建ObjectPool<ISomeInterface>。您可以使用泛型类型MyClass<TT> where T:class,ISomeInterface,new()在其中声明ObjectPool<TT>,然后再声明类型为MyClass<SomeClassWhichImplementsISomeInterfaceAndHasADefaultConstructor>的变量,但编译器只能在ObjectPool<T>时执行T的方法{1}}是特定的已知类类型,它符合所有约束条件。

或者,您可以省略new约束,然后要求构造ObjectPool<T>的任何代码必须传递构造函数(或创建实例的其他方法)Func<T>。这样就可以创建ObjectPool<ISomeInterface>,前提是有一个方法,当被调用时,会返回一个实现ISomeInterface的某种合适类型的新对象。