модификаторы общедоступного типа для интерфейса

#c# #interface

#c# #интерфейс

Вопрос:

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

Комментарии:

1. общедоступный? также: под «модификаторами типов» вы подразумеваете «модификаторы доступности»?

2. Элементы интерфейса неявно являются общедоступными. Не реализация.

Ответ №1:

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

Комментарии:

1. за исключением того, что они не обязательно должны быть общедоступными … они могут быть явными

2. Хотя технически я согласен, я считаю, что явный интерфейс по-прежнему определяет общедоступный контракт типа; Тот факт, что тип реализует этот интерфейс, является частью его общедоступного определения, и поэтому доступ к этим элементам интерфейса является простым и гарантированным / обязательным. Private определяет, что инкапсулировано и скрыто типом, частью которого интерфейс на самом деле не является.

Ответ №2:

Существует два способа реализации метода интерфейса; первый — это неявная реализация, которая предполагает, что общедоступный API предоставляет методы интерфейса, и это то, что вы, без сомнения, видите.

Однако вы также можете использовать явную реализацию:

 void IDisposable.Dispose() {
    // clean up
}
  

это тривиальный пример; это частный, но удовлетворяющий интерфейсу. Явная реализация всегда имеет приоритет над методом с аналогичным именем в общедоступном API.

На самом деле, часто необходима явная реализация, например, для реализации IEnumerable<T> , поскольку существуют два конфликтующих GetEnumerator() метода; обычно используется следующее:

 // public API will be used for implicit IEnumerable<T>.GetEnumerator()
public IEnumerator<T> GetEnumerator() { ... do work ... }
// explicit implementation of IEnumerable.GetEnumerator()
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
  

Итак: если вам не нужны общедоступные члены; используйте явную реализацию.

Ответ №3:

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