Поделиться через


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

Обновлен: Ноябрь 2007

Интерфейс — это контракт для поддержки определенной функциональности. Классы, реализующие интерфейс, должны предоставить подробные сведения о реализации для членов, указанных в интерфейсе. Например, интерфейс IEnumerator определяет подписи членов, которые нужно реализовать для поддержки перечисления набора объектов, такого как коллекция. Для реализации интерфейса IEnumerator класс должен реализовать члены Current, MoveNext и Reset.

Когда член интерфейса явно реализован классом, к члену можно обратиться, только используя ссылку на интерфейс. В результате, член интерфейса становится скрытым. Явная реализация члена интерфейса становится целесообразной не только для обеспечения соответствия контракту интерфейса, но и для его усовершенствования (например, для предоставления строго типизированных методов, которые должны использоваться вместо слабо типизированных методов интерфейса). Явная реализация члена интерфейса также является необходимой, если требуется, чтобы член интерфейса не вызывался разработчиками. Например, член GetObjectData очень часто реализуется явно, так как он вызывается инфраструктурой сериализации и не предназначен для вызова из кода.

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

Избегайте явной реализации членов интерфейса без серьезной необходимости.

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

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

Это, в основном, члены, которые поддерживают инфраструктуры платформы .NET Framework, такие как привязка данных или сериализация. Например, свойство IsReadOnly предназначено для доступа только из инфраструктуры привязки данных с использованием ссылки на интерфейс ICollection<T>. Класс List<T> явно реализует указанное свойство, так как это соответствует данному правилу.

Рекомендуется явно реализовывать члены интерфейса для моделирования вариантов (например, изменения параметров или возвращаемого типа в переопределенных членах).

Это часто осуществляется для предоставления строго типизированных версий членов интерфейса.

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

Это эффективный способ переименования членов. Например, класс Stream явно реализует метод Dispose и предоставляет вместо него метод Close.

Не используйте явно реализованные члены в качестве границы безопасности.

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

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

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

Фрагменты — © Корпорация Майкрософт (Microsoft Corp.), 2005. Все права защищены.

Фрагменты — © Addison-Wesley Corporation. Все права защищены.

Дополнительные сведения о рекомендациях по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.

См. также

Основные понятия

Разработка интерфейса

Другие ресурсы

Правила разработки членов

Руководство по разработке библиотек классов