Атрибуты и свойства
Иногда бывает полезно показать, что объект имеет некие открытые свойства, которые могут быть доступны и/или которые можно модифицировать через СОМ-интерфейс. СОМ 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
Пакет Direct-to-COM фирмы Microsoft позволяет клиентам использовать свойства как открытые элементы данных интерфейса с помощью некоего очень хитрого механизма.