Атрибуты и свойства
Иногда бывает полезно показать, что объект имеет некие открытые свойства,
которые могут быть доступны и/или которые можно модифицировать через СОМ-интерфейс.
СОМ IDL позволяет аннотировать методы интерфейса с тем, чтобы данный метод
либо модифицировал, либо читал именованный атрибут объекта. Рассмотрим
такое определение интерфейса:
[ object, uuid(0BB3DAE1-11F4-11d1-8C84-0080C73925BA) ]
interface ICollie : IDog {
// Age is a read-only property
// Age (возраст) - это свойство только для чтения
[propget] HRESULT Age([out, retval] long *pVal);
// HairCount is a read/write property
// HairCount (счетчик волос) - свойство для чтения/записи
[propget] HRESULT HairCount([out, retval] long *pVal);
[propput] HRESULT HairCount([in] long val);
// CurrentThought is a write-only property
// CurrentThought (текущая мысль) - свойство только для записи
[propput] HRESULT CurrentThought([in] BSTR val);
}
Использование атрибутов [propget] и [propput] информирует
компилятор IDL, что методы, которые ему соответствуют, должны быть отображены
в преобразователи свойств (property mutators) или в аксессоры на языках,
явно поддерживающих свойства. Применительно к Visual Basic это означает,
что элементами Age, HairCount и CurrentThought
можно манипулировать, используя тот же синтаксис, как при обращении к
элементам структуры:
Sub UseCollie(fido as ICollie)
fido.HairCount = fido.HairCount - (fido.Age * 1000)
fido.CurrentThought = "I wish I had a bone"
End Sub
С++-отображение этого интерфейса просто прибавляет к именам методов
конструкции put_ или get_, чтобы подсказать программисту,
что обращение относится к свойству:
void UseCollie(ICollie *pFido)
{
long n1, n2;
HRESULT hr = pFido->get_HairCount(&n1);
assert(SUCCEEDED(hr));
hr = pFido->get_Age(&n2);
assert(SUCCEEDED(hr));
hr = pFido->put_HairCount(n1 - (n2 * 1000)):
assert(SUCCEEDED(hr));
BSTR bstr = SysAllocString(OLESTR("I wish I had a bone"));
hr = pFido->put_CurrentThought(bstr);
assert(SUCCEEDED(hr));
SysFreeString(bstr);
}
Хотя свойства напрямую не обеспечивают развития, они полезны для выполнения
точных преобразований на те языки, которые их поддерживают1.
1 Пакет Direct-to-COM фирмы Microsoft
позволяет клиентам использовать свойства как открытые элементы данных
интерфейса с помощью некоего очень хитрого механизма.
Исключения
Где мы находимся?
|