【问题标题】:Is it possible to constrain generic types to Interface, new()?是否可以将泛型类型限制为接口 new()?
【发布时间】:2014-08-06 14:16:34
【问题描述】:

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

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”来创建新实例,但我担心执行此实例化的速度。

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

【问题讨论】:

  • 如果你使用classnew,你必须给它一个具体的类型
  • 即使你解决了这个问题,你想如何使用反射来实例化一个接口的实例?
  • 根据您的尝试,我想如果您喜欢public class ObjectPool&lt;T&gt; where T : IRecyclable;这样就好了。
  • 我不相信你真的想要这里的“new()”约束。创建新的ObjectPool&lt;ISomeInterface&gt; 不需要新的约束。

标签: c# generics interface constructor constraints


【解决方案1】:

接口只能实现其他接口。

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】:

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

    【讨论】:

    • 但是丹尼尔,这是有效的,对吧? public class ObjectPool&lt;T&gt; where T : IRecyclable
    【解决方案3】:

    您不能构造ObjectPool&lt;ISomeInterface&gt;。你可以有一个泛型类型MyClass&lt;TT&gt; where T:class,ISomeInterface,new() 在其中声明一个ObjectPool&lt;TT&gt;,然后再声明MyClass&lt;SomeClassWhichImplementsISomeInterfaceAndHasADefaultConstructor&gt; 类型的变量,但是当T 属于 时,编译器只能执行ObjectPool&lt;T&gt; 的方法满足所有约束的特定已知类类型

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

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多