
- •Введение в объектно-ориентированное программирование (ооп)
- •Краеугольные камни ооп Формула объекта
- •Природа объекта
- •Объекты и компоненты
- •Классы объектов
- •Три кита ооп
- •Объекты
- •Конструкторы и деструкторы
- •Свойства Понятие свойства
- •Методы получения и установки значений свойств
- •(Материал следующих трех глав при первоначальном знакомстве с материалом можно опустить) Свойства-массивы
- •Свойство-массив как основное свойство объекта
- •Методы, обслуживающие несколько свойств
- •Наследование Понятие наследования
- •Контроль и преобразование типов
- •Разграничение доступа к атрибутам объектов
- •Классы и объекты Delphi
- •Interface
- •Implementation
Свойства Понятие свойства
Помимо полей и методов в объектах существуют свойства. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам.
Объявление свойства выполняется с помощью зарезервированного слова 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 предписывает избегать прямого обращения к полям, создавая вместо этого соответствующие свойства. Это упорядочивает работу с объектами, изолируя их данные от непосредственной модификации. В будущем внутренняя структура класса, которая иногда является достаточно сложной, может быть изменена с целью повышения эффективности работы программы. При этом потребуется переработать только методы чтения и записи значений свойств; внешний интерфейс класса не изменится.