Сущность технологии СОМ. Библиотека программиста   ::   Бокс Дональд

Страница: 58 из 528

Однако для того, чтобы сделать интерфейс IPersistentObject возможно более общим, он должен быть своим собственным интерфейсом, а не порождаться от IFastString:

class IPersistentObject

{

public: virtual void Delete(void) = 0;

virtual bool Load(const char *pszFileName) = 0;

virtual bool Save(const char *pszFileName) = 0;

};

Это не мешает реализации FastString стать постоянной; это просто означает, что постоянная версия FastString должна поддерживать оба интерфейса: и IFastString, и IPersistentObject:

class FastString : public IFastString, public IPersistentObject

{

int m_cch;

// count of characters

// счетчик символов

char *m_psz;

public: FastString(const char *psz);

~FastString(void);

// Common methods

// Общие методы

void Delete(void);

// deletes this instance

// уничтожает этот экземпляр

// IFastString methods

// методы IFastString

int Length(void) const;

// returns # of characters

// возвращает число символов

int Find(const char *psz) const;

// returns offset

// возвращает смещение

// IPersistentObject methods

// методы IPersistentObject

bool Load(const char *pszFileName);

bool Save(const char *pszFileName);

};

Чтобы записать FastString на диск, пользователю достаточно с помощью RTTI связать указатель с интерфейсом IPerststentObject, который выставляется объектом:

bool SaveString(IFastString *pfs, const char *pszFN)

{

bool bResult = false;

IPersistentObject *ppo = dynamic_cast(pfs);

if (ppo) bResult = ppo->Save(pszFN);

return bResult;

}

Эта методика работает, поскольку транслятор имеет достаточно информации о представлении и иерархии типов класса реализации, чтобы динамически проверить объект для выяснения того, действительно ли он порожден от IPersistentObject. Но здесь есть одна проблема.

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

|< Пред. 56 57 58 59 60 След. >|

Java книги

Контакты: [email protected]