继承和扩展泛型中的约束

时间:2015-11-08 06:05:10

标签: c#

我有一个基本泛型类,看起来像这样:

public abstract class BaseTestDataEntity<T>
      where T : IIdEntity, ICodeEntity, IActiveEntity, new()
   {
}

这些接口代表数据实体中的字段。这非常有用,因为使用这些接口我可以编写通用基类,可以使用添加,更新等方法。

但真正有用的是基于接口中的合同的完整设计时支持。

实例的一个例子:

public class Customer : BaseTestDataEntity<Customer>
   {}

现在我有一种情况,我想创建一个BaseTestDataEntity的派生类,它将包含base的所有约束(因此根据代码,T必须有id,code和active标志)

但是在派生类中,我想添加其他约束。

这样我就不必复制BaseTestDataEntity中的具体方法了。

我尝试了什么以及我想做什么:

public class BaseTestDataEntityImpl<T>
   : BaseTestDataEntity<T> where T : IIdEntity, ICodeEntity, IMultiTextEntity, IActiveEntity, new()

   {
       // This should enforce T constaints in the base class, but where do I put in new constraints in the derived T?
   }

1 个答案:

答案 0 :(得分:2)

我不确定您实际想要实现的目标,但在您的代码中,所有约束仅影响派生BaseTestDataEntityImpl<T>。它们不会在继承链下传递到BaseTestDataEntity

为了使它更清楚,我们假设我有以下课程:

public class FooHandler<T> where T : IFoo {}

现在我希望有另一个继承FooHandler的类,但也需要它的通用参数来实现IBar

public class FooAndBarHandler<TFooAndBar> where TFooAndBar : IFoo, IBar

如您所见,我甚至以不同的方式命名通用参数,因为它们实际上是不同的。 TFooAndBar并且它的约束与类TFoo派生的FooAndBarHandler无关。您必须确保传递给FooHandler的任何内容都实现了IFoo,这就是为什么TFooAndBar必须实现TFoo的原因。但是还有其他方法可以完全填充基类通用约束。如果你假设以下情况:

interface IFoo {}
interface IBar : IFoo {}

你可以写

public class BarHandler<TBar> : FooHandler<TBar> where TBar : IBar

因为TBar : IBar约束已迫使TBar同时实施IFoo

或者你可以硬编码FooHandler<MyFooImplementation>

public class BarHandler<TBar> : FooHandler<MyFooImplementation> where TBar : IBar