40

这是故事。我创建了一个界面,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()当前上下文中不存在该方法。有人可以帮我理解我做错了什么吗?

4

3 回答 3

50

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

class Vehicle: IVehicle {

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

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

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

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

对于它的价值——这可能不是对显式接口实现的特别好的使用。通常,当您的类具有用于典型操作的完整接口但也实现了可能取代其中一些操作的接口时,您希望使用显式实现。典型示例是一个File实现IDisposable. 它会有一个Close()方法,但需要实现Dispose()。当作为一个File你会使用Open/Close。但是,当在 using 语句中打开时,它会将其视为 an IDisposableand call Dispose。在这种情况下Dispose,只需调用Close. 您不一定要Dispose作为File实现的一部分公开,因为可以从Close.

于 2010-03-26T01:57:55.450 回答
13

根据MSDN

可以显式地实现接口成员——创建一个 只通过接口调用的类成员,并且特定于该接口。

C# 语言规范中:

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

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

于 2010-03-26T01:59:06.407 回答
4

为了避免对您的类进行大量无聊的强制转换,您可以创建一个指针作为接口类型

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

然后使用调用成员bar.

于 2015-04-24T05:19:16.413 回答