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


         

и IPlane подвергнуты подобной операции,


Допуская, что интерфейсы 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. В силу этой проблемы данная технология годится только в тех ситуациях, когда можно быть уверенным, что класс реализации (или любые возможные производные классы) никогда не станет подменять конфликтный метод.



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

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