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



Множественные интерфейсы и имена методов - часть 2


Допуская, что интерфейсы IBoat и IPlane подвергнуты подобной операции, можно реализовывать различные версии GetMaxSpeed простым наследованием от расширенных версий интерфейсов и переопределением неконфликтных версий каждого метода GetMaxSpeed:

class CarBoatPlane : public IXCar, public IXBoat, public IXPlane { public: // Unknown methods - методы IUnknown STDMETHODIMP QueryInterface(REFIID, void**); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);

// IVehicle methods - методы IVehicle // do not override GetMaxSpeed! // не подменяем GetMaxSpeed!

// ICar methods - методы ICar STDMETHODIMP Brake(void);

// IBoat methods - методы IBoat STDMETHODIMP Sink(void);

// IXPlane methods - методы IXPlane STDMETHODIMP TakeOff(void);

// upcalled from IXCar::GetMaxSpeed // вызвано из IXCar::GetMaxSpeed STDMETHODIMP GetMaxCarSpeed(long *pval);

// upcalled from IXBoat::GetMaxSpeed // вызвано из IXBoat::GetMaxSpeed STDMETHODIMP GetMaxBoatSpeed(long *pval);

// called from IXPlane::GetMaxSpeed // вызвано из IXPlane::GetMaxSpeed STDMETHODIMP GetMaxPlaneSpeed(long *pval); }

Рисунок 4.6 иллюстрирует представление этого класса и форматы таблиц vtbl. Отметим, что конфликтный метод GetMaxSpeed не реализован в этом классе. Поскольку каждый из базовых классов CarBoatPlane подменяет этот чисто виртуальный метод, то CarBoatPlane не нуждается в создании своей собственной реализации. Действительно, если бы в CarBoatPlane нужно было подменить GetMaxSpeed, то одна его реализация этого метода подменила бы версии, вызываемые из каждого базового класса, аннулировав результат использования IXCar, IXBoat и IXPlane. В силу этой проблемы данная технология годится только в тех ситуациях, когда можно быть уверенным, что класс реализации (или любые возможные производные классы) никогда не станет подменять конфликтный метод.

Рис. 4.6. Разрешение конфликта имен между интерфейсами

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


Содержание  Назад  Вперед