在接口中使用基类

时间:2014-03-08 20:56:47

标签: c# class interface

我有一个基类:

class BaseClass{ }

我想实现使用基类的接口:

public interface IClass
{
   BaseClass GetValue();
}

然后创建实现此接口的子类,但在方法中返回自己类型的类:

class Child: BaseClass, IClass
{
   Child GetValue(); 
}

我该如何正确地做到这一点?

2 个答案:

答案 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。