我有一个基本泛型类,看起来像这样:
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?
}
答案 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