Почему я не могу назвать методы в классе, который явно реализует интерфейс?

Вот история. Я создал интерфейс, IVehicle. Я явно реализовал интерфейс в своем классе, Vehicle.cs.

Вот мой интерфейс:

Interface IVehicle
{
        int getWheel();
}

вот мой класс:

class Vehicle: IVehicle
{

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

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

Заметьте это getWheel() явно реализован. Теперь, когда я пытаюсь назвать тот метод в своем классе Механизма, я получаю ошибку при указании на это getWheel() не существует в текущем контексте. Кто-то может помочь мне понять то, что я делаю неправильно?

37
задан River 3 October 2017 в 04:25
поделиться

2 ответа

Когда вы явно реализуете интерфейс, вам сначала нужно привести объект к интерфейсу, а затем вы можете вызвать метод. Другими словами, метод доступен только тогда, когда метод вызывается для объекта как типа интерфейса, а не как конкретный тип.

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 .

42
ответ дан 27 November 2019 в 04:48
поделиться

Согласно MSDN :

Можно явно реализовать член интерфейса - создавая {{ 1}} член класса, который вызывается только через интерфейс и является специфическим для этого интерфейса.

И в спецификациях языка C # :

Невозможно получить доступ к явной реализации члена интерфейса через его полное имя при вызове метода, доступе к свойству или доступе индексатора. К реализации явного члена интерфейса можно получить доступ только через экземпляр интерфейса, и в этом случае на него ссылается просто его имя члена .

Чтобы получить доступ к этому члену, вы можете сначала привести класс к интерфейсу, а затем получить к нему доступ.

12
ответ дан 27 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: