Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решенные оветы на теорию Си.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
166.91 Кб
Скачать

Интерфейсы

Необходимость появления интерфейсов в .NET вызвана, в том числе и соображениями совместимости с технологиями COM. И если CLR-объекты могут работать с Win32-кодом посредством импорта DLL, то Win32-программы имеют возможность взаимодействовать с объектами .NET только через механизм COM-интерфейсов. Кстати, эта возможность даёт нам альтернативный способ разработки COM-компонентов, который к тому же является более лёгким и приятным занятием, чем использование MFC или ATL.

Как известно, CLR не поддерживает множественного наследования классов. Возможно, это и правильно. Во-первых, не все языки его реализуют, а, во-вторых, механизм виртуальных базовых классов, обычно использующийся для разрешения конфликтов при множественном наследовании, значительно усложняет структуру таблицы виртуальных методов класса и делает вызовы виртуальных функций крайне неэффективными. С другой стороны, “облегчённый вариант” множественного наследования не порождает таких проблем и широко используется при разработке COM-компонентов вообще и с использованием библиотеки ATL в частности.

В отличие от наследования классов CLR разрешает множественное наследование интерфейсов, но это наследование и сами интерфейсы имеют ряд важных ограничений.

  • все методы интерфейсов являются виртуальными и абстрактными и всегда имеют public-доступ, при этом ключевые слова virtual и public и суффикс =0 указывать не обязательно;

  • методы не могут иметь реализации и должны быть переопределены в классах-наследниках;

  • интерфейсы не могут содержать данных;

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

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

70