为什么我不能在明确实现接口的类中调用方法?
这是故事。我创建了一个界面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()
在当前上下文中不存在。有人能帮助我了解我做错了什么吗?
当您明确实现接口时,首先必须将该对象转换为接口,然后才能调用该方法。换句话说,只有当方法作为接口类型在对象上调用时,方法才可用,而不是作为具体类型。
class Vehicle: IVehicle {
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(((IVehicle)this).getWheel());
}
}
有关详细信息,请参阅此reference。以下是相关代码片段:
在方法调用,属性访问或索引器访问中,无法通过完全限定的名称访问显式接口成员实现。一个显式的接口成员实现只能通过一个接口实例来访问,在这种情况下,只能通过它的成员名称来引用。
对于它的价值 - 这可能不是一个特别好用的显式接口实现。通常情况下,如果您有一个类具有完整的典型操作接口的类,并且实现了可能取代其中一些操作的接口,那么您希望使用显式实现。规范示例是实现IDisposable
的File
类。它将有一个Close()
方法,但需要执行Dispose()
。当作为File
处理时,您将使用Open/Close
。但是,在使用说明中打开时,它会将其视为IDisposable
并致电Dispose
。在这种情况下,Dispose
只需调用Close
。您不一定要将Dispose
作为File
实施的一部分公开,因为可以从Close
获得相同的行为。
根据MSDN:
这是可以实现的 接口成员明确地创造一个 类成员只能通过接口称为 ,并且是特定 到该接口。
它是不可能通过其全 限定名来访问,方法调用的 显式接口成员 实现, 属性访问或索引访问。一个 显式接口成员 实现只能通过一个接口实例访问 ,并且在这种情况下 简单地通过其成员名称引用 。
要访问此成员,您可以先将该类转换为接口,然后对其进行访问。
避免大量枯燥的蒙上你的类,你可以创建一个指针使用bar.
作为一个Java的人接口类型
然后调用成员,我很奇怪,为什么这个令人费解的事情存在?为什么会有人想要上述存在,它获得了什么优势? – 2010-03-26 02:11:52
在明确实施的成员上指定可见性修饰符是语法错误。一旦您的对象已被转换为您的界面类型,该成员始终可以访问。 – Trillian 2010-03-26 02:14:32
@mP如果您正在使用通用成员实现多个接口,则这允许您为每个接口提供不同的定义。它还增加了清理智能感知,因为显式成员不可见或不可用,除非您投射到适当的界面。 – 2010-12-21 18:27:33