【发布时间】:2016-12-09 03:38:27
【问题描述】:
我有一个通用接口 (MyInterface<T>),它由下面示例中的 ChildA 类实现:
public interface MyInterface<T>
{
MyObj<T> GetObj(); // Irrelevant
}
class ChildA : MyInterface<ChildA>
{
// Irrelevant:
MyObj<ChildA> GetObj() {
return new MyObj<ChildA>();
}
}
这可行,但我需要确保 <T> 始终具有 implementing 类的类型,因此在这种情况下 T 应该始终是 ChildA 类型,因为它由ChildA实现。
另一个正确的实现可能是这样的,例如:
class ChildB : MyInterface<ChildB> { ... }
但目前,这种不正确的实现也是可能的,但它不应该是:
class ChildA : MyInterface<ChildB> { ... }
有没有办法强制执行?
【问题讨论】:
-
我不确定您要在这里做什么。可以强制执行自身的类型,但几乎没有收获。其背后的动机是什么?
-
你为什么要这个?
-
@MioBambino 我正在使用它来实现数据传输对象。这一切都已经工作了,但正如我提到的,仍然可以将其设置为另一种类型。这就是为什么我需要强制这种情况不会发生。
-
这种方法怎么样?
public interface MyInterface { MyObj<MyInterface> GetObj(); } -
这被称为Curiously Recurring Template Pattern,顺便说一句,不,没有办法在C#中添加这个限制。引用@EricLippert,"[模板] 似乎是对机制的滥用,而不是对程序“业务领域”的概念建模。
标签: c# .net generics inheritance interface