Объектно-ориентированное программирование (ООП) - это методика разработки программ, в основе которой лежит понятие объекта, как некоторой структуры, описывающей объект реального мира, его поведение.
Свойства объектов. Инкапсуляция.
Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и обновление их содержимого должно производиться посредством вызова соответствующих методов. Это правило называется инкапсуляцией. В языке Object Pascal принцип нкапсуляции реализуется посредством свойств - виртуальных характеристик объектов, базирующихся на значениях конкретных полей.
Поля объекта хранят данные (т.е. занимают место в памяти), а свойства посредством вызова соответствующих методов позволяют определять и узнавать различные характеристики объектов, которые, в общем случае, могут и не храниться в памяти, а, например, вычисляться по формулам.
Обычно свойство определяется полем соответствующего типа и двумя методами доступа – для чтения значения поля (функция) и изменения значения (процедура):
type TMyClass = class fValue : TSomeType; function GetValue: TSomeType; procedure SetValue(NewValue: TSomeType); property pValue: TSomeType read GetValue write SetValue; end; |
В этом примере fValue – поле для хранения значения свойства, GetValue – метод для чтения значения свойства, SetValue – метод для изменения значения свойства, pValue – само свойство, TSomeType – тип данного свойства. |
В тексте программы использование свойства не отличается от использования обычного поля, но при компиляции вызов свойства для чтения или для записи заменяется вызовом соответствующих методов, например (var MyObject : TMyClass) :
исходный текст |
интерпретируется как |
MyObject.pValue:=AValue; |
MyObject.SetValue(AValue); |
AVariable:= MyObject.pValue; |
AVariable:= MyObject.GetValue; |
В рамках методов Get и Set прописываются дополнительные операции, которые необходимо выполнить для реализации чтения или изменения свойства. Например, при изменении ширины формы надо не просто занести в соответствующую ячейку новое значение, но и выполнить операции по перерисовке на мониторе как самой формы, так и окружающей ее области.
Если же дополнительные операции не требуются, то при описании свойства ссылку на метод можно заменить ссылкой на поле. Рассмотрим следующее описание:
type
TMyClass = class
fValue : TSomeType;
procedure SetValue(NewValue: TSomeType);
property pValue: TSomeType read fValue write SetValue;
function Correct(Value: TSomeType):boolean;
procedure DoSomeThing;
end;
...
procedure TmyClass.SetValue(NewValue: TSomeType);
begin
if Correct(NewValue) then fValue:=NewValue;
DoSomeThing;
end;
Здесь чтение свойства pValue означает просто чтение поля fValue. Зато при присвоении
ему значения внутри SetValue будут вызваны сразу два метода.
Если свойство только читается или записывается, то в его описании присутствует только
один, соответствующий, метод:
property pValue: TSomeType read GetValue;
В этом примере попытка изменить значение свойства pValue вызовет ошибку компиляции