Атрибуты и свойства

Атрибуты и свойства

Иногда бывает полезно показать, что объект имеет некие открытые свойства, которые могут быть доступны и/или которые можно модифицировать через СОМ-интерфейс. СОМ 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->getHairCount(&n1);

assert(SUCCEEDED(hr));

hr = pFido->getAge(&n2);

assert(SUCCEEDED(hr));

hr = pFido->putHairCount(n1 – (n2 * 1000)): assert(SUCCEEDED(hr));

BSTR bstr = SysAllocString(OLESTR(«I wish I had a bone»));

hr = pFido->putCurrentThought(bstr);

assert(SUCCEEDED(hr));

SysFreeString(bstr);

Хотя свойства напрямую не обеспечивают развития, они полезны для выполнения точных преобразований на те языки, которые их поддерживают[1].