Область действия полей объекта и параметр SELF
Принципы ООП требуют, чтобы прямые обращения к полям объекта в тексте основной программы производились как можно реже, обращение к полям предпочтительно только из доступных им методов. Таким образом, в основной программе должны быть только вызовы методов, изменяющих поля.
Так как данные и методы инкапсулированы в одном объекте, все данные (поля) объекта глобальны по отношению к любым его методам и могут в них использоваться в виде простого имени (не составного).Каждая переменная объектного типа имеет свои поля и использует методы, общие для всех переменных этого типа.
При обращении к методу ему передается особый системный идентификатор SELF (свой, внутренний), представляющий собой обобщенное имя конкретного экземпляра объекта. Внутри методов объекта действует неявный оператор WITH экземпляра (SELF). Это обеспечивает обработку данных именно этого конкретного экземпляра объектного типа. Для объектов допустим и явный With.
Так как область действия (domain) полей данных объекта распространяется на тела подпрограмм, реализующих методы данного объекта, имена формальных параметров методов (если они есть) не должны совпадать ни с одним из имен полей данных этого объекта.
Компилятор автоматически обрабатывает параметр SELF, поэтому не стоит использовать его явно. Исключением является случай, когда возникает "конфликт" между идентификаторами в пределах методов. Пример такой "развязки" приведен в листинге 2. В программе листинга 2 одинаковы имена элементов записи и полей объекта.
Листинг 2.Развязка конфликта имен.
Uses Crt;
Type PosRec = Record { - объявление записи }
Line, Col : Word; { - имена ее элементов }
end; { - конец объявления записи }
ObjPos = OBJECT { - объявление объекта }
Line, Col : Word; { - совпали имена полей объекта и записи }
Procedure Init ( Роs : PosRec );
end; { - конец объявления объекта }
{ ----- Метод объекта ObjPos ------- }
Procedure ObjPos.Init ( Pos : PosRec );
Begin
With Pos do begin { - присоединение к формальному параметру }
{ поля > } Self.Line := Line;{ <- поля записи с With для}
{ объекта : } Self.Col := Col; { формального параметра }
end { - With }
End;
{ Переменные типа: }
Var VObj: ObjPos; { - объект }
VPosRec: PosRec; { - запись }
{ -------- Основная программа----------- }
Begin ClrScr;
VPosRec.Line := 2; { - инициализация полей записи } VPosRec.Col := 5;
Writeln('Поля записи: ', #10#13,
'VPosRec.Line =', VPosRec.Line, { - вывод полей записи }
' VPosRec.Col = ', VPosRec.Col );
Writeln('Неинициализированные поля объекта:', #10#13,
'VObj.Line =', VObj.Line, { - вывод полей объекта } ' VObj.Col = ', VObj.Col );
VObj.Init(VPosRec); { - инициализация полей объекта данными записи }
Writeln('Инициализированные поля объекта:', #10#13,
'VObj.Line = ', VObj.Line, ' VObj.Col = ',VObj.Col ); End.
Дата добавления: 2019-12-09; просмотров: 681;