Свойства объектов

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

type TPeople = class

FName: string;

procedure GetName;

construcor Create;

Destructor Destroy;

property Name: string read FName write GetName; // Свойство

end;

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

var People: TPeople;

Get: string;

...

People.Name:= 'Сергей';

Get:= People.Name;

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

type TPeople = class

FName: array of string;

function GetName: integer;

property Name: integer read GetName;

end;

function TPeople.GetName: integer;

begin

Result:= Length(FName);

end;

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

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

type TPeople = class

FName: boolean;

procedure SetName(const AName: boolean);

function GetName: integer;

property Name: boolean read FName write SetName;

property Count: integer read GetName;

end;

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

procedure TPeople.SetName(const AName: boolean);

begin

if Name <> AName then

begin

if ANfme then // Если состояние изменяется то

...

else

...

FName:= AName; // Сохранение состояния в поле

end;

end;

Один и тот же метод может использоваться для получения (установки) значений нескольких свойств одного типа. В этом случае каждому свойству назначается целочисленный индекс, который передаётся в метод чтения (записи) первым параметром. Пример:

type TPeople = class

...

property FirstName: string index 0 read GetItem;

property LastName: string index 1 read GetItem;

property Phone: string index 2 read GetItem;

end;

var People: TPeople;

...

Writeln(People.FirstName); // Эквивалентно: Writeln(People.GetItem(0));

Writeln(People.LastName); // Эквивалентно: Writeln(People.GetItem(1));

Writeln(People.Phone); // Эквивалентно: Writeln(People.GetItem(2));

Инкапсуляция. Методы доступа к свойствам объектов

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: