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