Вот история. Я создал интерфейс, IVehicle
. Я явно реализовал интерфейс в своем классе, Vehicle.cs
.
Вот мой интерфейс:
Interface IVehicle
{
int getWheel();
}
вот мой класс:
class Vehicle: IVehicle
{
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(getWheel());
}
}
Заметьте это getWheel()
явно реализован. Теперь, когда я пытаюсь назвать тот метод в своем классе Механизма, я получаю ошибку при указании на это getWheel()
не существует в текущем контексте. Кто-то может помочь мне понять то, что я делаю неправильно?
Когда вы явно реализуете интерфейс, вам сначала нужно привести объект к интерфейсу, а затем вы можете вызвать метод. Другими словами, метод доступен только тогда, когда метод вызывается для объекта как типа интерфейса, а не как конкретный тип.
class Vehicle: IVehicle {
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine( ((IVehicle)this).getWheel() );
}
}
См. ссылку в MSDN для получения дополнительной информации.Вот соответствующий фрагмент:
Невозможно получить доступ к явной реализации члена интерфейса через его полное имя при вызове метода, доступе к свойству или доступе индексатора. Доступ к явной реализации члена интерфейса можно получить только через экземпляр интерфейса, и в этом случае на него ссылаются просто по имени члена.
Как бы то ни было - это, вероятно, не очень хорошее использование явной реализации интерфейса. Как правило, вы хотите использовать явную реализацию, когда у вас есть класс, который имеет полный интерфейс для типичных операций, но также реализует интерфейс, который может заменять некоторые из этих операций. Канонический пример - это класс File
, который реализует IDisposable
. У него будет метод Close ()
, но потребуется реализовать Dispose ()
. При обработке как файла
вы должны использовать Open / Close
. Однако при открытии в операторе using он будет рассматривать его как IDisposable
и вызывать Dispose
. В этом случае Dispose
просто вызывает Close
. Вы не обязательно захотите предоставлять Dispose
как часть реализации File
, поскольку такое же поведение доступно из Close
.
Согласно MSDN :
Можно явно реализовать член интерфейса - создавая {{ 1}} член класса, который вызывается только через интерфейс и является специфическим для этого интерфейса.
И в спецификациях языка C # :
Невозможно получить доступ к явной реализации члена интерфейса через его полное имя при вызове метода, доступе к свойству или доступе индексатора. К реализации явного члена интерфейса можно получить доступ только через экземпляр интерфейса, и в этом случае на него ссылается просто его имя члена .
Чтобы получить доступ к этому члену, вы можете сначала привести класс к интерфейсу, а затем получить к нему доступ.