为什么我不能在显式实现接口的类中调用方法?
这是故事。 我创建了一个界面, IVehicle
。 我在我的类Vehicle.cs
明确地实现了接口。
这是我的界面:
Interface IVehicle { int getWheel(); }
这是我的class级:
class Vehicle: IVehicle { public int IVehicle.getWheel() { return wheel; } public void printWheel() { Console.WriteLine(getWheel()); } }
请注意, getWheel()
已明确实现。 现在,当我尝试在我的Vehicle类中调用该方法时,我收到一个错误,指示当前上下文中不存在getWheel()
。 有人能帮我理解我做错了吗?
显式实现接口时,首先必须将对象强制转换为接口,然后才能调用该方法。 换句话说,只有在对象上调用方法作为接口类型而不是具体类型时,该方法才可用。
class Vehicle: IVehicle { public int IVehicle.getWheel() { return wheel; } public void printWheel() { Console.WriteLine( ((IVehicle)this).getWheel() ); } }
有关详细信息,请参阅MSDN上的此参考 。 这是相关的片段:
在方法调用,属性访问或索引器访问中,无法通过其完全限定名称访问显式接口成员实现。 显式接口成员实现只能通过接口实例访问,并且在这种情况下仅通过其成员名称引用。
对于它的价值 – 这可能不是一个特别好的显式接口实现的使用。 通常,如果您的类具有典型操作的完整接口,并且还实现可能取代其中某些操作的接口,则您希望使用显式实现。 规范示例是实现IDisposable
的File
类。 它将有一个Close()
方法,但需要实现Dispose()
。 当作为File
处理时,您将使用Open/Close
。 但是,当在using语句中打开时,它会将其视为IDisposable
并调用Dispose
。 在这种情况下, Dispose
只需调用Close
。 您不一定要将Dispose
作为File
实现的一部分公开,因为Close
提供了相同的行为。
根据MSDN :
可以实现接口成员显式创建仅通过接口调用的类成员 ,并且特定于该接口。
并且在C#语言规范中 :
在方法调用,属性访问或索引器访问中,无法通过其完全限定名称访问显式接口成员实现。 显式接口成员实现只能通过接口实例访问,并且在这种情况下仅通过其成员名称引用。
要访问此成员,您可以先将类强制转换为接口,然后再访问它。
为了避免在类上进行大量无聊的转换,可以创建一个指针作为接口类型
public class Foo : IBar { readonly IBar bar; public Foo() { bar = this; } }
然后使用bar.
调用成员bar.