Когда вы явно реализуете интерфейс, вы сначала должны привести объект к интерфейсу, затем вы можете вызвать метод. Другими словами, метод доступен только тогда, когда метод вызывается для объекта как тип интерфейса, а не как конкретный тип.
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 он будет обрабатываться как IDisposable
и вызывать Dispose
. В этом случае Dispose
просто звонит Close
. Вам не обязательно показывать Dispose
как часть реализации File
, поскольку такое же поведение доступно с Close
.