- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
4.12.2. Типы интерфейсов.
Интерфейс СОМ позволяет приложениям и различным компонентам обращаться к функциям данного компонента СОМ. К функциям компонента можно обращаться с помощью таблицы виртуальных функций (virtual function table), которая также называется viable (виртуальная таблица) или VTBL. Эта таблица не содержит реально существующих функций. Вместо них она содержит набор указателей на функции компонента. Компонент, которому необходимо получить доступ к функции другого компонента, обращается к таблице виртуальных функций. Клиенты не могут обращаться к VTBL напрямую. Для этого используется другой указатель, называемый указателем интерфейса (interface pointer), добавляющий промежуточный уровень доступа, который делает возможной реализацию этого интерфейса. Это означает, что клиент видит только указатель на указатель в таблице виртуальных функций. На рис. показана структура интерфейса СОМ.
IUnknown
IInterface1
IInterface2
Единственное требование к таблице VTBL интерфейса СОМ состоит в том, что первое поле в таблице должно быть указателем на интерфейс IUnknown. IUnknown — единственный интерфейс, который должен быть реализован в любом компоненте, чтобы последний мог стать компонентом СОМ. По существу, это дверь к другим интерфейсам, поскольку все другие интерфейсы наследуются из интерфейса IUnknown.
Компоненты СОМ содержат реализации любого количества интерфейсов. Вся реализация может быть единственным классом, но это не обязательное требование. Поскольку компонент может содержать множество классов, эти классы могут создавать экземпляры стольких объектов и типов, сколько им потребуется. Объект является текущим экземпляром (копией) этих классов. Совокупность объектов обеспечивает реализацию интерфейсов компонента.
Компоненты используют интерфейсы для взаимодействия. После того, как интерфейс определен и опубликован (т.е. сделан общедоступным для использования без ограничений), его нельзя изменить. Одно из правил СОМ — программное обеспечение поддерживается неизменным интерфейсом после его опубликования. Если вы измените интерфейс, то должны опубликовать его как другой, новый интерфейс, а ранее опубликованный интерфейс останется неизменным.
Этот принцип следует учитывать при планировании интерфейса. Хорошо поработав над планированием, вы уменьшите вероятность последующих изменений программного кода. Пока интерфейс не изменен, программный код, использующий этот интерфейс, изменять не требуется. Если вы должным образом не спланируете интерфейсы, то весьма вероятно, что понадобится вносить изменения и в интерфейсы, и в программные коды.
Свойства интерфейсов
• Интерфейс не является классом. Интерфейс не является классом, соответствующим обычному определению классов VC++. При создании объекта из класса нельзя создать экземпляр интерфейса, поскольку это не повлечет его реализации. Интерфейс реализуется классом, и экземпляр должен быть создан именно из этого класса, чтобы стать объектом, предоставляющим интерфейс.
• Интерфейс не является объектом. Интерфейс представляет собой просто связанный набор функций и методов, с помощью которых клиенты и объекты обмениваются информацией. Когда у клиента есть доступ к объекту, он не имеет ничего, кроме указателя интерфейса (interface pointer), с помощью которого он может обратиться к функциям интерфейса. Этот указатель непрозрачен, т.е. скрывает все аспекты внутренней реализации. Вы не можете увидеть детали, относящиеся к объекту, например информацию о его состоянии. Такая ситуация противоположна указателям объекта (object pointer) в VC++, с помощью которого клиент может получить прямой доступ к данным объекта. В СОМ клиент может только вызывать функции интерфейса по имеющемуся указателю. Но это не ограничение — это именно то, что позволяет СОМ обеспечивать эффективную поддержку стандарта бинарного кода (binary standard), допускающего прозрачность месторасположения (location transparency).
• Интерфейсы строго подразделены по типам. Каждый интерфейс имеет собственный уникальный идентификатор (GUID). Это предохраняет от конфликтов с другими интерфейсами.
• Интерфейсы неизменны. Интерфейсы не имеют версий, что устраняет проблемы с версиями. Новая версия интерфейса, созданная добавлением или удалением функций или изменением его семантики, становится совершенно новым интерфейсом с новым идентификатором. Поэтому новый интерфейс не конфликтует со старым, даже если все изменения внесены.