Вторник, 30.04.2024, 20:24
Распределенная обработка данных
Здравствуйте Гость | RSS
Главная страница Интерфейс Регистрация Вход
Меню сайта

Считалка

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

§ 7.  Интерфейс.

Несколько лет назад «космический челнок» «Атлантис» состыкавался с российской орбитальной станцией «Мир». Американцы установили на свой корабль российский стыковочный узел, подходящий к соответствующему узлу станции. Пока узел не изменился и пока он установлен на корабле, космический аппарат может стыковаться с чем угодно. Имея два узла, вы могли бы пристыковать свой «Фольксваген» к дому, а не ставить его в гараж.

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

Интерфейс DLL – это набор функций, экспортируемых ею.

Интерфейс класса С++ - это набор членов данного класса.

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

Более точно: в COM интерфейсом является определенная структура в памяти, содержащая массив указателей на функции. Каждый элемент массива содержит адрес функции, реализуемой компонентом.

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

Для клиента компонент представляет собой набор интерфейсов.

В COM интерфейсы значат больше, чем реализующие их компоненты.


§ 7.1  Повторное использование архитектур приложение.

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

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

 

§ 7.2  Другие преимущества интерфейсов COM.

1.     Интерфейсы предохраняют систему от повреждений при модификации.

2.     Интерфейсы позволяют клиенту работать с разными компонентами единообразно. Эта способность к унифицированной работе с разными компонентами известна как полиморфизм. (Космический «челнок» работает с каждым объектом, имеющим стыковочный узел, так, будто это орбитальная станция.)

Интерфейс обеспечивает эти преимущества путем инкапсуляции определенного поведения. (Стыковочный узел инкапсулирует механику стыковки. Он скрывает детали того, с чем стыкуется корабль. Поскольку корабль стыкуется только с другим стыковочным узлом, постольку станцию можно заменить на очень большую вафельницу, что не повлияет на «челнок» в смысле стыковки.)

 

§ 7.3  Реализация интерфейса COM.

 

Приведем фрагмент программы, в котором компонент CA использует IX и IY для реализации двух интерфейсов:

 

class IX             // Первый интерфейс

{

  public:

virtual void Fx1()=0;

virtual void Fx2()=0;

};

 

class IY             // Второй интерфейс

{

  public:

virtual void Fy1()=0;

virtual void Fy2()=0;

};

virtual void Fx1() {cout << "Fx1” << endl;}

virtual void Fx2() {cout << "Fx2” << endl;}

 

// Реализация абстрактного базового класса IY.

virtual void Fy1() {cout << "Fy1” << endl;}

virtual void Fx2() {cout << "Fy2” << endl;}

};

IX и IY – это чисто абстрактные базовые классы, которые используются для реализации интерфейсов.

Чисто абстрактный базовый класс – это базовый класс, который содержит только чисто виртуальные функции.

Чисто виртуальная функция – это виртуальная функция, «помеченная» = Øзнаком спецификатора чистоты. Чисто виртуальные функции не реализуются в классах, в которых объявлены, они только декларируются. Реализуются же они в производном классе. (Компонент СА наследует двум чисто абстрактным базовым классам – IX и IY – и реализует их чисто виртуальные функции.)

Чтобы стать интерфейсами COM, IX и IY должны наследовать интерфейсу IUknown.

Используя следующее определение из заголовочного файла OBJBASE.H

#define_interface struct  перепишем наш фрагмент:

#include <objbase.h>

interface IX

{

virtual void_ _stdcall Fx1()=0;

virtual void_ _stdcall Fx2()=0;

};

interface IY ...

...

(Члены структуры автоматически объявляются имеющими общий доступ, поэтому не требуется ключевое слово public).


Рис. 7.2 Компонент с двумя интерфейсами.


§ 7.4  Соглашение о вызове _stdcall (или Pascal).

Это расширение языка, специфичное для компилятора Microsoft. Функция, помеченная как _stdcall, использует соглашение о вызове языка Pascal. Такая функция выбирает параметры из стека перед возвратом в вызывающую процедуру.

В соответствии же с обычным соглашением о вызове С/С++ стек очищает вызывающая процедура, а не вызываемая. Это стандартное соглашение применяется потому, что оно используется для всех функций Win32 API, за исключением имеющих переменное число аргументов. Стандартное соглашение о вызовах применяется в Windows потому, что уменьшает размер кода[1]. Предполагается, что вы будете следовать этим правилам. Вы можете использовать и другие соглашения о вызове, но должны их ясно документировать и учитывать, что клиенты, написанные на некоторых языках, могут оказаться не в состоянии использовать Ваши интерфейсы.

 

В лабораторной работе №1 необходимо реализовать компонент без динамической компоновки. Клиент взаимодействует с компонентом посредством указателя на класс, а не на интерфейс. Использование указателя на класс требует, чтобы клиент знал, как объявлен класс. Объявление класса содержит множество деталей реализации. Изменение этих деталей потребует перекомпиляции клиента. (В следующей лабораторной работе мы не будем использовать указатель на класс). В лабораторной работе №1 мы реализовали один компонент с помощью одного класса. В COM один компонент можно реализовать при помощи нескольких классов. В первой лабораторной работе класс наследует интерфейсы. Однако COM не требует, чтобы класс, реализующий интерфейсы, наследовал их, поскольку клиент никогда не видит иерархию наследования в компоненте COM. (Вместо того, чтобы собирать все интерфейсы в одном классе, можно реализовать их отдельно и использовать указатели на соответствующие классы.)

Благодаря поддержке множественных интерфейсов компонент можно рассматривать как набор интерфейсов. Это определяет рекурсивно-вложенную природу компонентной архитектуры (см. рис. 7.3). Интерфейс – это набор функций, компонент – набор интерфейсов, система – набор компонентов. Будем рассматривать интерфейсы как различные варианты поведения компонента.





Рис. 7.3 Система компонентов – это набор компонентов, из которых каждый поддерживает набор интерфейсов, из которых каждый содержит набор функций.


[1] В языке Pascal параметры передаются в вызываемую процедуру слева направо, в С – наоборот. В стандартном соглашении о вызове порядок передачи параметров взят из С, а порядок очистки из стека – из Pascal.

Поиск

Друзья сайта

2024