2010-03-26 94 views
26

这是故事。我创建了一个界面IVehicle。我明确实施了我的课程中的界面Vehicle.cs为什么我不能在明确实现接口的类中调用方法?

这里是我的接口:

Interface IVehicle 
{ 
     int getWheel(); 
} 

这里是我的类:

class Vehicle: IVehicle 
{ 

    public int IVehicle.getWheel() 
    { 
     return wheel; 
    } 

    public void printWheel() 
    { 
     Console.WriteLine(getWheel()); 
    } 
} 

注意getWheel()明确实施。现在,当我尝试在我的Vehicle类中尝试调用该方法时,我收到一个错误,指出getWheel()在当前上下文中不存在。有人能帮助我了解我做错了什么吗?

+0

作为一个Java的人接口类型

public class Foo : IBar { readonly IBar bar; public Foo() { bar = this; } } 

然后调用成员,我很奇怪,为什么这个令人费解的事情存在?为什么会有人想要上述存在,它获得了什么优势? – 2010-03-26 02:11:52

+0

在明确实施的成员上指定可见性修饰符是语法错误。一旦您的对象已被转换为您的界面类型,该成员始终可以访问。 – Trillian 2010-03-26 02:14:32

+3

@mP如果您正在使用通用成员实现多个接口,则这允许您为每个接口提供不同的定义。它还增加了清理智能感知,因为显式成员不可见或不可用,除非您投射到适当的界面。 – 2010-12-21 18:27:33

回答

35

当您明确实现接口时,首先必须将该对象转换为接口,然后才能调用该方法。换句话说,只有当方法作为接口类型在对象上调用时,方法才可用,而不是作为具体类型。

class Vehicle: IVehicle { 

    public int IVehicle.getWheel() 
    { 
     return wheel; 
    } 

    public void printWheel() 
    { 
     Console.WriteLine(((IVehicle)this).getWheel()); 
    } 
} 

有关详细信息,请参阅此reference。以下是相关代码片段:

在方法调用,属性访问或索引器访问中,无法通过完全限定的名称访问显式接口成员实现。一个显式的接口成员实现只能通过一个接口实例来访问,在这种情况下,只能通过它的成员名称来引用。

对于它的价值 - 这可能不是一个特别好用的显式接口实现。通常情况下,如果您有一个类具有完整的典型操作接口的类,并且实现了可能取代其中一些操作的接口,那么您希望使用显式实现。规范示例是实现IDisposableFile类。它将有一个Close()方法,但需要执行Dispose()。当作为File处理时,您将使用Open/Close。但是,在使用说明中打开时,它会将其视为IDisposable并致电Dispose。在这种情况下,Dispose只需调用Close。您不一定要将Dispose作为File实施的一部分公开,因为可以从Close获得相同的行为。

+0

谢谢。我只做了这件事以证明我可以做到。至此,我正在使用的这本书没有给出任何理由表明需要明确实现接口。 – tyrone302 2010-03-26 18:26:25

+0

另一个常见的例子是在Winforms应用程序生成的'.Designer'文件中。每个控件都是在一对'.BeginInit()'和'.EndInit()'方法之间初始化的,但是这些调用都是在*将控件投射到'ISupportInitialize'之后。 – kdbanman 2015-11-25 17:51:36

11

根据MSDN

这是可以实现的 接口成员明确地创造一个 类成员只能通过接口称为 ,并且是特定 到该接口。

而在C# language specifications

它是不可能通过其全 限定名来访问,方法调用的 显式接口成员 实现, 属性访问或索引访问。一个 显式接口成员 实现只能通过一个接口实例访问 ,并且在这种情况下 简单地通过其成员名称引用 。

要访问此成员,您可以先将该类转换为接口,然后对其进行访问。

3

避免大量枯燥的蒙上你的类,你可以创建一个指针使用bar.

相关问题