我有一个基类:
class BaseClass{ }
我想实现使用基类的接口:
public interface IClass
{
BaseClass GetValue();
}
然后创建实现此接口的子类,但在方法中返回自己类型的类:
class Child: BaseClass, IClass
{
Child GetValue();
}
我该如何正确地做到这一点?
答案 0 :(得分:4)
使用泛型:
public interface IClass<T> where T : BaseClass
{
T GetValue();
}
class Child: BaseClass, IClass<Child>
{
Child GetValue();
}
答案 1 :(得分:0)
那并不容易。你期望它工作的方式不是因为任何实现IClass
的类必须完全从接口实现该方法(如果你有一个IClass实例,你怎么知道GetValue()返回的静态类型是Child?有使用泛型的变通方法,但它们可能不太好用,即
public T GetValue<T>();
您可以在其中准确指定要返回的类型。但是,如果与虚拟重载结合使用,可能会变得非常难看。另一种方法是创建一个新的实现:
class Child: BaseClass, IClass
{
BaseClass IClass.GetValue();
new Child GetValue();
}
像这样,如果调用中对象的静态类型为BaseClass
,则为IClass
;如果静态类型为Child
,则为Child
。
请记住
IClass a = new Child();
Child b = a.GetValue(); // Error: Cannot convert BaseClass to Child
永远不会工作,因为IClass.GetValue()的 static 返回类型是BaseClass。