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