QueryInterface симметрична
Спецификация СОМ требует, чтобы, если запрос QueryInterface
на интерфейс B удовлетворяется через интерфейсный указатель типа
A, то запрос QueryInterface на интерфейс A
того же самого объекта через результирующий интерфейсный указатель типа
В всегда был успешным. Это значит, что если верно
QI(A)->B
то также должно быть верным
QI(QI(A)->B)->A
Из свойства, показанного на рис. 4.2, следует, что утверждение, заключенное
в следующем коде, всегда должно быть истинным:
void AssertSymmetric(ICar *pCar)
{
if (pCar) {
IPlane *pPlane = 0;
// request a second type of interface
// запрашиваем второй тип интерфейса
HRESULT hr = pCar->QueryInterface(IID_IPlane, (void**)&pPlane);
if (SUCCEEDED(hr)) {
ICar *pCar2 = 0;
// request original type of interface
// запрашиваем исходный тип интерфейса
hr = pPlane->QueryInterface(IID_ICar, (void**)&pCar2);
// if the following assertion fails, pCar
// did not point to a valid СОМ object
// если следующее утверждение не будет правильным,
// то pCar не укажет на правильный СОМ-объект
assert(SUCCEEDED(hr));
pCar2->Release();
}
pPlane->Release();
}
}
Симметричность QueryInterface означает, что клиенты не должны
заботиться о том, какой из интерфейсов запрашивать первым, так как любые
два типа интерфейсов могут быть запрошены в любом порядке.
QueryInterface транзитивна
QueryInterface рефлективна
Объекты имеют статический тип
Единственность и идентификация
QueryInterface и IUnknown
Множественные интерфейсы и имена методов
Динамическая композиция
Двоичная композиция
Включение
Где мы находимся?
|