在满足接口要求时,我的子类似乎无法伪装成基类。例如:
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#接口的限制?
答案 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例子也是如此,我无法理解为什么你认为它是一个弱点。