可以使用C#完成这样的事情吗?
public abstract class BaseClass
{
public abstract IInterface<T> CreateEditor() where T: the_actual_type_of_this_instance;
}
使用示例:
var instance = new DerivedClass();
var editor = instance.CreateEditor(); // IInterface<DerivedClass>
答案 0 :(得分:3)
不,你不能这样做 - 部分是因为它在编译时没有意义。考虑对代码进行轻微更改:
BaseClass instance = new DerivedClass();
var editor = instance.CreateEditor();
编译器可以推断editor
的类型是什么?它只知道BaseClass
,因此必须返回IInterface<BaseClass>
。根据{{1}}中的T
是否有协变性,这可能对实际实施IInterface<T>
或可能不是
您可能希望改为使用基类:
IInterface<DerivedClass>
这有两个问题:
public abstract class BaseClass<T> where T : BaseClass<T>
{
public abstract IInterface<T> CreateEditor();
}
public class DerivedClass : BaseClass<DerivedClass>
{
...
}
的子类,那么您将遇到问题DerivedClass
......但在很多情况下它非常实用。