【发布时间】:2011-07-03 15:59:26
【问题描述】:
C# 中的接口方法可以显式实现,以便在将实例显式转换为接口类型时调用它们的实现。为什么类的虚方法也不支持这一点?
虽然解决“多重继承”问题是接口所独有的,但似乎出于其他所有原因,显式实现的成员对接口很有用,它们对虚拟方法也很有用。一个更清晰的回报型协方差模型浮现在脑海中。
编辑:根据要求,示例:
public class Foo {
...
}
public class Bar : Foo {
...
}
class Base {
abstract Foo A ();
}
class Dervied {
private Bar _b;
Bar A () {
return _b;
}
Foo Base.A () {
return _b;
}
}
我知道使用辅助方法来模拟这种情况,但最终效果似乎具有显式实现所具有的任何不良特征,但 API 更脏。我的问题的症结不是如何做返回类型协变,而是为什么虚拟方法不支持类似的接口机制。
【问题讨论】:
-
您能解释一下您对这项工作的设想吗?如果
Derived扩展Base,您正在寻找Base上的虚拟方法,仅在Derived转换为Bar的实现上调用?我看不到这种信息隐藏形式的实用程序。举个例子会有所帮助。 -
显式接口实现是一个创可贴。您必须使用它来解决由于能够继承可能具有具有相同签名的成员的多个接口而引入的歧义。这是多重继承的标准问题,减去必须在多个继承的实现之间进行选择的问题。 C# 中不存在的问题,因为接口无法定义实现。因此不需要显式方法覆盖,只有一个基本实现可供选择。
-
您的示例使用
abstract方法,而不是virtual方法。你的问题能更准确一点吗? -
抽象方法实际上是隐式的并且更接近于接口中定义的成员,这是我的比较。然而,我的问题旨在涵盖这两种情况。
标签: c# interface virtual-functions explicit-implementation