Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ООП C#.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

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

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

Чтобы ознакомиться с различными способами решения этой проблемы, создайте новое консольное приложение по имени InterfaceNameClash и добавьте в него три специальных интерфейса, представляющих различные места, в которых реализующий их тип может визуализировать свой вывод:

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

Хотя компиляция этого кода пройдет гладко, одна возможная проблема все же присутствует. Выражаясь просто, предоставление единственной реализации метода Draw() не позволяет предпринимать уникальные действия на основе того, какой интерфейс получен от объекта Octagon. Например, следующий код будет приводить к вызову одного и того же метода Draw(), какой бы интерфейс не был получен:

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

Как видите, при явной реализации члена интерфейса основной шаблон сводится к следующему:

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

Поскольку явно реализованные члены всегда неявно закрыты, они перестают быть доступными на уровне объектов. И действительно, если вы примените к типу Octagon операцию точки, то обнаружите, что средство IntelliSense не отображает никаких членов Draw(). Как и следовало ожидать, для доступа к требуемой функциональности должно использоваться явное приведение. Ниже представлен пример:

Наряду с тем, что этот синтаксис полезен, когда необходимо устранить конфликты имен, явную реализацию интерфейсов можно применять и просто для сокрытия более “сложных” членов на уровне объектов. В таком случае при использовании операции точки пользователь объекта будет видеть только подмножество всей функциональности типа. Тем не менее, те, кому требуется более сложное поведение, могут извлекать желаемый интерфейс через явное приведение. Доработайте проект для демонстрации явной реализации интерфейсов