【发布时间】:2012-05-29 09:44:40
【问题描述】:
如果一个接口指定了一个属性或方法来返回另一个接口,为什么不允许第一个接口的实现将返回类型“更改”为更具体的类型?
我们举个例子来说明:
interface IFoo
{
IBar GetBar();
}
interface IBar
{ }
class Foo : IFoo
{
// This is illegal, we are not implementing IFoo properly
public Bar GetBar()
{
return new Bar();
}
}
class Bar : IBar
{ }
我知道如何让它发挥作用,这不是我关心的。
我可以:
- 将
GetFoo()的返回类型更改为IBar,或者 - 显式实现接口,只需从
IFoo.GetBar()方法调用GetBar
我真正要问的是不只是允许上面的代码编译的原因。是否存在上述不履行IFoo指定的合同的情况。
【问题讨论】:
-
还有第三种方式,比上面两种方式稍微方便一些。您可以使用抽象类来实现接口。然后,在你的“具体”类中继承抽象类而不是接口。然后在您的“具体”类中,您可以使用“new”关键字隐藏基本方法。它对我来说工作得很好。
-
我觉得 BrainSlugs83 的评论在这里是一个答案,因为它提供了一个不错的解决方法。
标签: c# interface language-design overloading