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

本文关键字:Interface new 约束 泛型类型 是否 | 更新日期: 2023-09-27 18:16:36

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

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"来创建一个新的实例,尽管我担心执行这个实例化的速度。

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

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

接口只能实现其他接口。

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)
    {
        ...
    }
}

您不能在那里提供接口。classnew要求它是可构造的引用类型

不能构造ObjectPool<ISomeInterface>。你可以有一个泛型MyClass<TT> where T:class,ISomeInterface,new()在它里面声明一个ObjectPool<TT>,然后再声明MyClass<SomeClassWhichImplementsISomeInterfaceAndHasADefaultConstructor>类型的变量,但是编译器只能在T是一个特定的已知类类型满足所有约束的情况下执行ObjectPool<T>的方法。

或者,您可以省略new约束,然后要求任何构造ObjectPool<T>的代码必须向构造函数(或创建实例的其他方法)传递Func<T>。这将使创建ObjectPool<ISomeInterface>成为可能,只要有一个方法,当调用该方法时,将返回一个实现ISomeInterface的合适类型的新对象。