Сущность технологии COM


Отделение интерфейса от реализации - часть 2


Заметим, что двоичное представление этого класса интерфейса не меняется с добавлением или удалением элементов данных из класса реализации FastString. Кроме того, использование опережающего объявления означает, что определение класса FastString не является необходимым для трансляции этого заголовочного файла. Это эффективно скрывает все детали реализации FastString от транслятора клиента. При использовании этого способа машинный код для методов интерфейса становится единственной точкой входа в DLL объекта, и их двоичные сигнатуры никогда не изменятся. Реализации методов класса интерфейса просто передают вызовы методов действующему классу реализации:

// faststringitf.срр // (part of DLL, not client) // (часть DLL, а не клиента) #include "faststring.h" #include "faststringitf.h" FastStringItf::FastStringItf(const char *psz) : m_pThis(new FastString(psz)) { assert(m_pThis != 0); } FastStringItf::~FastStringItf(vo1d) { delete m_pThis; } int FastStringItf::Length(void) const { return m_pThis->Length(); } int FastStringItf::Find(const char *psz) const { return m_pThis->Find(psz); }

Эти передающие методы должны быть транслированы как часть DLL FastString, так что когда двоичное представление класса реализации FastString меняется, вызов нового оператора в конструкторе FastStringItf будет сразу же перекомпилирован, если, конечно, зарезервировано достаточно памяти. И опять клиент не получит описания класса реализации FastString. Это дает разработчику FastString возможность со временем развивать реализацию без прерывания существующих клиентов.

Рис. 1.4. Классы-дескрипторы в качестве интерфейсов

Рисунок 1.4 показывает, как использовать классы-дескрипторы для отделения интерфейса от реализации на этапе выполнения. Заметим, что косвенный подход, введенный классом интерфейса, устанавливает двоичную защитную стену (firewall — брандмауэр) между клиентом и реализацией объекта. Эта двоичная стена очень точно описывает, как клиент может сообщаться с реализацией. Все связи клиент-объект осуществляются через класс интерфейса, который содержит очень простой двоичный протокол для входа в область реализации объекта.


Начало  Назад  Вперед



Книжный магазин