[英]Is it possible to constrain generic types to Interface, new()?
我正在尝试创建一个简单的对象回收类
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”来创建一个新实例,尽管我担心执行这个实例化的速度。
解决这种情况的正确方法是什么? 有一个更简单的解决方案,我完全忽略了吗?
您无法在那里提供界面。 class
和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)
{
...
}
}
您无法构造ObjectPool<ISomeInterface>
。 你可以有一个泛型类型MyClass<TT> where T:class,ISomeInterface,new()
声明一个ObjectPool<TT>
,然后在声明MyClass<SomeClassWhichImplementsISomeInterfaceAndHasADefaultConstructor>
类型的变量,但编译器只能执行方法ObjectPool<T>
当T
是满足所有约束的特定已知类类型时 。
或者,您可以省略new
约束,然后要求构造ObjectPool<T>
任何代码必须将构造函数(或创建实例的其他方法)传递给Func<T>
。 这样就可以创建一个ObjectPool<ISomeInterface>
前提是有一个方法,当被调用时,它将返回一个实现ISomeInterface
的某种合适类型的新对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.