Область действия полей объекта и параметр 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; просмотров: 688;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.