C#接口和类型伪装

时间:2009-12-17 20:42:09

标签: c# inheritance interface

在满足接口要求时,我的子类似乎无法伪装成基类。例如:

class MyBaseClass
{}

class MySubClass : MyBaseClass
{}

interface MyInterface
{
    MyBaseClass someFunction();
}

class MyImplementation : MyInterface
{
    public MySubClass someFunction() { return null; }
}

生成以下错误:

  

'MyNamespace.MyImplementation'没有实现接口成员'MyNamespace.MyInterface.someFunction()'。 'MyNamespace.MyImplementation.someFunction()'无法实现'MyNamespace.MyInterface.someFunction()',因为它没有匹配的返回类型'MyNamespace.MyBaseClass'。

这也是需要接口与实现的问题。例如,如果我有一个带有返回IList的函数的接口,我的实现就不能返回一个List - 它必须返回一个IList。

我做错了什么或者这是C#接口的限制?

4 个答案:

答案 0 :(得分:4)

C#不支持协变返回类型。实现接口时,必须返回接口指定的类型。如果需要,可以显式实现接口,并使用另一个返回子类型的同名方法。例如:

class MyImplementation : MyInterface
{
    MyBaseClass MyInterface.someFunction() { return null; }
    public MySubClass someFunction() { return null; }
}

答案 1 :(得分:2)

签名必须完全匹配,您必须这样做:

class MyImplementation : MyInterface
{
    public MyBaseClass someFunction() { return null; }
}

你可以像这样实现泛型:

interface MyInterface<T>
{
    T someFunction();
}

class MyImplementation : MyInterface<MySubClass>
{
    public MySubClass someFunction() { return null; }
}

注意:我可能会遗漏与语法相关的内容,例如MyInterface.someFunction

答案 2 :(得分:1)

如果界面需要MyBaseClass,那么您需要提供该类型。您可以向下转换MySubClass实例并在检索时将其强制转换。

答案 3 :(得分:0)

MyImplementation显然没有实现该接口;返回MySubClass的方法与返回MyBaseClass的方法不同,无论它们是否是相关的类。

你的List / IList例子也是如此,我无法理解为什么你认为它是一个弱点。