Синтаксис C #: размещение имени интерфейса в объявлении реализации - PullRequest
4 голосов
/ 01 февраля 2010

Я столкнулся с интересным синтаксисом C #, с которым я не знаком в исходном коде для библиотеки составных приложений для класса DelegateCommand<T> WPF .

Существуют некоторые объявления методов с префиксом имени интерфейса ICommand, и в них не указаны модификаторы доступности. Например:

bool ICommand.CanExecute(object parameter) { ... }

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

Ответы [ 5 ]

7 голосов
/ 01 февраля 2010

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

Кроме того, сравнение может быть полезным для полного понимания того, что это значит.

5 голосов
/ 01 февраля 2010

Это называется Явная реализация интерфейса :

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

Если два члена интерфейса не выполнить ту же функцию, однако, это может привести к неверному реализация одного или обоих интерфейсы. Можно реализовать элемент интерфейса явно - создание члена класса это вызывается только через интерфейс, и конкретно к этому интерфейс. Это достигается называя ученика именем интерфейса и точка.

Учебник по реализации явного интерфейса

1 голос
/ 01 февраля 2010

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

Основная идея заключается в том, что эти методы / свойства доступны только при явном использовании через экземпляр интерфейса этого типа.

1 голос
/ 01 февраля 2010

Это называется явная реализация интерфейсов. Это означает, что данная конкретная реализация CanExecute не будет видна (и не будет работать), ЕСЛИ ОБЪЕКТ не приведен как ICommand.

Это может быть полезно, позволяя классу предоставлять разные реализации для разных интерфейсов, где имена методов перекрываются

public interface  InterfaceOne {
  void SomeMethod();
}
public interface InterfaceTwo {
  void SomeMethod();
}
public class Impl : InterfaceOne, InterfaceTwo {
  public void InterfaceOne.SomeMethod() {Console.WriteLine("One");}
  public void InterfaceTwo.SomeMethod() {Console.WriteLine("Two");}
}

Я лично ненавижу этот синтаксис. Возьмите пример OracleParameter, который предоставляет только явную реализацию ICloneable .

Если у вас есть ссылка на OracleParameter, метод Clone () не будет отображаться в intellisense и не будет виден, когда вы переходите к определению. Однако, способность есть, если вы делаете ((ICloneable)parameter).Clone(). Чтобы даже знать, что это возможно, вы можете делать то, что вы застряли в поисках в блогах.

0 голосов
/ 01 февраля 2010

Это называется явной реализацией интерфейса, и вы можете узнать об этом здесь .

В Visual Studio, если вы наследуете от интерфейса, вы можете щелкнуть правой кнопкой мыши на имени интерфейса в определении класса. Вы можете нажать либо «Интерфейс реализации», либо в подменю «Явный интерфейс реализации». Это удобный ярлык для реализации интерфейсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...