Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 02 Введение в ООП.doc
Скачиваний:
59
Добавлен:
23.03.2015
Размер:
201.22 Кб
Скачать

Свойства Понятие свойства

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

Объявление свойства выполняется с помощью зарезервированного слова property, например:

TMyClass1 = class

FA : integer;

procedure SetA(value : integer);

function CalcA(value: integer) : integer;

property A : integer read FA write SetA;

end;

Ключевые слова read и write называются спецификаторами доступа. После слова read указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства, а после слова write — поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, чтение свойства A означает чтение поля FA, а установка свойства — вызов метода SetA. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field). Мы в дальнейшем также будем пользоваться этим соглашением.

Обращение к свойствам выглядит в программе как обращение к полям:

var

MyClass1 : TMyClass1;

…..

MyClass1.A:=333; // Эквивалентно MyClass.SetA(333);

i:=MyClass1.A; // Эквивалентно i:=MyClass1.FA

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

В следующем примере объявлено поле FName и свойство Name, значение которого можно только читать.

TMyClass1 = class

FName : string;

FA : integer;

procedure SetA(value : integer);

function CalcA(value: integer) : integer;

function GetName: string;

property A : integer read FA write SetA;

property Name read GetName; // Только для чтения!

end;

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

// конструктор объекта TMyClass1

Constructor TMyClass1.Create(Name:string);

begin

FName:=Name;

end;

// метод получения значения свойства Name

Function TPerson.GetName;

begin

Result:=FName;

end;

Приведенный конструктор объекта TMyClass1 создает объект и устанавливает значение поля FName, определяющего значение свойства Name.

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

MyClass1:= TMyClass1.Create('My first object');

В отличие от полей свойства не имеют адреса в памяти, поэтому к ним запрещено применять операцию @. Как следствие, их нельзя передавать в var- и out-параметрах процедур и функций.

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