Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Библиотека визуальных компонентов VCL >> Структура справочника и соглашения >> Инкапсуляция. Свойства >> Векторные свойства
Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Векторные свойства


Свойство может быть и векторным; в этом случае для программиста оно выглядит как массив:

Property APoints[Index: Integer]:TPoint
═════════read GetPoint write SetPoint;

На самом деле это поле может в действительности и не являться массивом (напомним, что вся обработка обращений к внутренним структурам класса может быть замаскирована).

Для векторного свойства необходимо описать не только тип элементов массива, но также имя и тип индекса. И после read, и после write в этом случае должны стоять имена методов ? использование имени поля типа массив недопустимо. Метод, читающий значение векторного свойства, должен быть описан как функция, возвращающая значение того же типа, что и элементы свойства, и имеющая единственный параметр: того же типа и с тем же именем, что и индекс свойства:

function GetPoint(Index:Integer):TPoint;

Аналогично, метод, помещающий значения в такое свойство, должен первым параметром иметь индекс, а вторым ? переменную нужного типа (которая может быть передана как по ссылке, так и по значению):

procedure SetPoint(Index: Integer; NewPoint: TPoint);

У векторных свойств есть еще одна важная особенность. Некоторые классы в Delphi (списки, наборы строк) "построены" вокруг векторного свойства. Основной метод такого класса дает доступ к некоторому массиву, а все остальные методы являются вспомогательными. Специально для облегчения работы в этом случае векторное свойство может быть описано как default:

type
══TMyObject = class;
════property Strings [Index: Integer] : string
═════════════read Get write Put; default;
══end;

Когда у объекта есть такое свойство, то можно его не упоминать, а ставить индекс в квадратных скобках прямо у имени объекта:

var AMyObject: TMyObject;
begin
══AMyObject.Strings[1] := 'First'; {первый способ}
══AMyObject[2] := 'Second'; ═══════{второй способ}
══....
end.

Будьте внимательны с применением зарезервированного слова default ? как мы увидели, для обычных и векторных свойств оно употребляется в разных случаях и с разным синтаксисом.

О роли свойств в Delphi красноречиво говорит следующий факт: у всех имеющихся в вашем распоряжении стандартных классов 100% полей недоступны и заменены базирующимися на них свойствами. Рекомендуем при разработке своих классов придерживаться этого же правила.



[Назад]    [Содержание ]    [Вперед]

  


Для комментария : kadan@grsu.grodno.by

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017