为什么我不能在显式实现接口的类中调用方法?

时间:2010-03-26 01:54:50

标签: c# interface explicit

这是故事。我创建了一个界面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()。有人能帮助我理解我做错了吗?

3 个答案:

答案 0 :(得分:39)

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

class Vehicle: IVehicle {

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

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

有关详细信息,请参阅MSDN上的reference。这是相关的片段:

  

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

对于它的价值 - 这可能不是特别好地使用显式接口实现。通常,如果您的类具有典型操作的完整接口,并且还实现可能取代其中某些操作的接口,则您希望使用显式实现。规范示例是实现File的{​​{1}}类。它将采用IDisposable方法,但需要实施Close()。当作为Dispose()处理时,您将使用File。但是,当在using语句中打开时,它会将其视为Open/Close并调用IDisposable。在这种情况下,Dispose只会调用Dispose。您不一定要将Close作为Dispose实施的一部分公开,因为File可以使用相同的行为。

答案 1 :(得分:12)

根据MSDN

  

可以实现一个   接口成员明确创建一个   仅被调用的类成员   通过界面,具体   到那个界面。

C# language specifications

  

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

要访问此成员,您可以先将类强制转换为接口,然后再访问它。

答案 2 :(得分:3)

为了避免在你的类上出现很多无聊的强制转换,你可以创建一个指针作为接口类型

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

然后使用bar.

致电会员