<<
>>

Свойства

Свойство - это средство Pascal Delphi, позволяющее определять интерфейс доступа к полям класса.

В Delphi различают:

простые или скалярные свойства;

свойства-массивы;

индексируемые свойства или свойства со спецификацией index; процедурные свойства.

Простые свойства. Описание простых свойств выполняется следующим образом (квадратные скобки в данном случае указывают, что соответствующая спецификация может быть опущена):

property :

[read ]

[write ]

[stored ]

[default ];

Спецификации, начинающиеся служебными словами read и write, определяют соответственно методы, которые должны быть использованы для чтения и записи свойства. Если метод чтения неопределен, то свойство недоступно для чтения. Если метод записи неопределен, то свойство недоступно для записи.

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

Остальные спецификации, названные спецификациями сохранения, используются только для свойств, определяемых в секции published, т.е. используемых для «опубликованных» компонент. Булевское значение после stored (вместо которого может быть указан метод, возвращающий булевское значение) определяет, должно ли сохраняться данное свойство компонента при сохранении формы (true - должно, false - не должно) в файле с расширением .dim. Последний спецификатор default определяет стандартное значение свойства, при совпадении значения поля с которым свойство не сохраняется.

Например:

private FValue: integer;

procedure SetValue(A Value:integer); function Store Value . boolean; published

property Value:integer read FValue write SetValue

stored StoreValue default 10; ...

Данное описание определяет свойство для внутреннего поля FValue некоторого класса. Чтение свойства выполняется напрямую из поля. Для записи в поле используется специальный метод SetValue. Сохранение в форме выполняется, если метод StoreValue возвращает true и значение отлично от 10.

Примечание. Принято называть поле класса, для которого определяется свойство, тем же именем, что и свойство, но с префиксом «F», а соответствующие параметры методов ввода и вывода с префиксом «А». Аналогично, имя метода чтения свойства желательно начинать с префикса «Get», метода записи - с «Set».

При необходимости в производном классе свойство можно переопределить, изменив доступность и/или спецификации. При этом можно указывать только изменяемые спецификации: остальные - наследуются.

В программе свойства используются как обычные поля, найример:

A. Value: =п;

или

k: -A. Value;

соответственно при этом будут выполняться следующие операции:

A.SetValue(n);

и

к: =A.FValue;

Простые свойства целесообразно использовать:

—для ограничения доступа к полю (например, доступ только для чтения);

- при необходимости обеспечить при записи или чтении выполнение некоторых дополнительных действий (например, при записи в поле необходимо еще и фиксировать факт изменения значения).

Пример 5.3. Использование простых свойств (графический редактор «Окружности» - вариант 2). Продемонстрируем особенности программирования с использованием свойств на примере 5.1. В нем мы разрабатывали приложение, позволяющее рисовать на специальном цоле окна приложения окружности.

Определим в классе два свойства Color и Radius. Изменение значений этих свойств свяжем с перерисовкой окружности. На рис. 5.9 представлена диаграмма класса TMyCircle для этого варианта.

Добавим еще одно изменение: поместим вызов процедуры рисования Draw в конструктор, так как конструирование объекта обычно связано с его рисованием. Текст модуля Circle имеет вид:

Unit Circle;

Interface

Uses extctrls, Graphics;

Type TMy Circle=class

private x,y,FRadius:Word; FColor .TColor; Image.Tlmage; Procedure Clear;

Procedure Draw;

Procedure SetSize(ARadius: Word);

Procedure SetColor (AColor:TColor);

public

Constructor Create(aImage:TImage;ax,ay,ARadius: Word;

AColor: TColor);

■ property Radius: Word write SetSize; property Color: TColor write SetColor;

end;

Implementation

Constructor TMyCircle.

Create;

Begin inherited Create;

Image: =almage; x: =ax; y:=ay;

FRadius: =ARadius; FColor: =AColor;

Draw;

End;

Procedure TMyCircle.Draw;

Begin Image. Canvas. Pen. Color: =FColor;

Image. Canvas.Ellipse(x-FRadius, y-FRadius,

x+FRadius, y+FRadius);

End;

Procedure TMyCircle.Clear;

Var TempColor: TColor;

Begin TempColor: =FColor;

FColor: =Image. Canvas. Brush. Color;

Draw;

FColor:=TempColor;

End;

Procedure TMyCircle.SetSize;

Begin Clear; FRadius:=ARadius; Draw; end;

Procedure TMy Circle.SetColor;

Begin Clear; FColor :=.AColor; Draw; end;

End.

При такой реализации класса вызов процедуры изменения размера и цвета рисунка будут программироваться как переназначение соответствующего свойства:

C.Radius: =strtoint(rEdit. Text);

или

C. Color: =ColorDialog. Color;

Прим e ч а н и e. Именно такой способ программирования лежит в основе всех стандартных компонент Delphi. Так, например, изменение свойства Visible, определенного для всех визуальных компонент, сопровождается в зависимости от ситуации появлением или исчезновением соответствующего компонента.

Анализ приведенного текста программы показывает, что использование простых свойств позволяет сократить количество компонентов класса, описанных в интерфейсной части (секция public), т.е. увеличивает степень инкапсуляции объектов.

Свойства-массивы. Описание свойств-массивов осуществляется следующим образом (квадратные скобки означают, что соответствующая спецификация может быть не указана):

property :

[read ] [write ] [default];

Список индексных параметров заключается в квадратные скобки. Это делает свойства-массивы внешне похожими на обычные массивы. Однако индексные параметры не являются индексами в привычном понимании этого термина. Значения индексных параметров, указанные при обращении к свойствам, передаются в методы чтения и записи в качестве обычных параметров. Соответственно тип индексных параметров может быть не только порядковым, но и вещественным или структурным.

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

Спецификация default используется для указания того, что из всех свойств объекта именно данное принимается по умолчанию (при обращении к объекту может быть опущено).

Например:

private function GetValMas(I:word;F:double):word;

procedure SetValMas(I:word;F:double;AElement:word) ; public prorerty ValMas[I:word, F:doubleJ:word

read GetValMas write SetValMas; default;

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

MyObject[k+2,s] :=/;

эквивалентно .

MyObject. ValMas[k+2,s]:=l;

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

Пример 5.4. Использование свойств-массивов (класс «Динамический массив» - вариант 1). Пусть требуется разработать класс для реализации динамического массива с произвольным количеством элементов-байт. Максимальный размер массива необходимо определять при его создании. В процессе работы должен отслеживаться реальный размер массива.

Предусмотреть возможность выполнения следующих операций:

- ввод массива из элемента TSringGrid и вывод в такой же элемент;

- модификацию указанного элемента;

- вставку элемента на указанное место;

- удаление элемента с заданным индексом.

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

Unit MasByte;

Interface

Uses Sys Utils, Dialogs, Grids;

Type

TMas=array[1..255] of byte;

TMasByte = class(TObject) {класс «Динамический массив»} private

ptr_an: ATMas; {указатель на массив}

len:byte; {максимальная длина массива}

Procedure SetEl(Ind:byte;m:byte); {процедура записи элемента}

Function GetEl(Ind:byte):byte; {функция чтения элемента}

public

n.Byte; {реальный размер массива}

Constructor Create(an:byte);

Destructor Destroy ¡override;

Property Mas[Ind: byte]: byte read GetEl write SetEl;default;

Procedure Modify(Ind:byte; Value.byte); {модификация элемента} Procedure lnsert(Ind:byte; Value.

byte); {вставка элемента} Function Delete(Ind:byte):byte; {удаление элемента}

Function InputMas(Grid: TStringGrid;I,J:integer):boolean; {ввод} Procedure OutputMas(Grid:TStringGrid;I,J:integer); {вывод} end;

Implementation Constructor TMasByte. Create;

Begin

inherited Create;

GetMem(ptr_an,an); len:=an; { n:=0; указывать не надо} End;

Destructor TMas Byte. Destroy;

Begin

FreeMem(ptr_an); inherited Destroy;

End;

Procedure TMas Byte. SetEl(Ind: byte; m; byte);

Begin

iflnd

<< | >>
Источник: Г.С.Иванова, Т.Н.Ничушкина, Е.К.Пугачев. Объектно- ориентированное программирование. 2001

Еще по теме Свойства:

  1. § 1 Общие свойства семейственных отношений. – Общественный их характер. – В чем они подчиняются юридическому определению. – Свойство семейной власти и отличие ее от обладания. – Вопросы и иски о состоянии, соединенные с семейными правами. – Восстановление семейной власти. – Вмешательство правительственной власти в семейные отношения. – Отношения родственные.
  2. СИСТЕМА НЕРВНАЯ: СВОЙСТВО
  3. КОНЦЕПЦИЯ И СВОЙСТВА ИНЬ — ЯН
  4. Глава 3 ВОСПРИЯТИЕ: ОРГАНИЗАЦИЯ И СВОЙСТВА
  5. 2.2. Идентификационные признаки и свойства
  6. Проявление психологического свойства
  7. Общие свойства
  8. 2.1.5. Юридические особенности и свойства информации
  9. Часть I Мужчина и женщина — свойства и качества
  10. § 5.2. Свойства и функции системы управления в организации
  11. § 6.3. Власть как свойство социальной системы