Шаг 75 - Расширения стандарта ANSI C++ - Свойства

К основным расширениям относится поддержка свойств в стиле Delphi. То есть свойство подразумевается не просто как поле (field), а как самостоятельные действующие в некотором роде процедуры. Например. При присваивании значения свойству в стиле обычного C++ (такие свойства в терминологии VCL) называются полями, мы изменяем само свойство, но при этом объект не реагирует на изменения. То есть после этого нужно вызвать еще какую-нибудь Update функцию. При присваивании значения, например, свойству Width какого-нибудь компонента, мы автоматически получаем перерисовку объекта на экране с новыми характеристиками.

Это одновременно и сильная и слабая стороны C++Builder. С одной точки зрения, это помогает строить понятный и компактный код, но с другой это делает программы на C++ Builder непереносимыми на другие архитектуры. Если сказать откровенно, даже программы MFC легче перенести, скажем, на платформу GTK, чем программы VCL. Впрочем, это предмет бессмысленного обсуждения... Если Вам нравится C++Builder, значит, все окей.

Свойства декларируются следующим образом:

Обычное свойство:

__property <тип> <имя> = { <атрибуты свойства> };
__property AnsiString Name = { read = GetName, write = SetName };

Индексированное свойство (массив):

__property <тип> <имя> [ <индексация массива> ] = { <атрибуты свойства> };
__property AnsiString List [int index] = { read = ReadList, write = SetList };

Перечислимое свойство (множество):

__property <тип множества> <имя> = {атрибуты свойства};

Например:

typedef enum { wsOpened, wsClosed, wsShadowed, wsTopmost } TWindowStyle;
typedef Set<TWindowStyle, wsOpened, wsTopmost> TWindowStyles;
__property TWindowStyles WindowStyle = { read = FWindowStyle, write = SetWindowStyle, default = wsOpened};

К атрибутам свойства относятся следующие:

Здесь все поля вроде бы понятны. Про некоторые расскажу позже. Возможно, нижеследующие замечания покажутся Вам ненужными, но все равно. Во-первых, помимо вызова функции свойство может ссылаться на поле. То есть можно сделать свойство полностью аналогичное полю - считываемое и записываемое без вызова функции. Во-вторых, реально свойство является только ссылкой на функцию или поле, и не содержит. В-третьих, функции, на которые ссылается свойство, должны быть соответствующим образом описаны, но об этом позже.

Замечания по поводу массивов. Несколько непривычно может показаться то, что, так как индекс в конечном итоге передается функции, тип индекса и их количество может быть любым. Например, если Вы программировали на Perl удобным Вам могло показаться использование ассоциативных массивов (хэшей). Так что индекс может быть строкой или даже указателем на структуру или объект. Очень удобно.

Продолжение про свойства в следующем шаге.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 30.05.2002