Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-5-8-11...doc
Скачиваний:
4
Добавлен:
21.04.2019
Размер:
122.88 Кб
Скачать

Вопрос 2. Экземпляры объекта. Описание объектных переменных. Наследование. Объекты-родители, объекты-потомки. Пример.

Экземпляры объектных типов описываются в точности так же,

как в Паскале описывается любая переменная, либо статическая, ли-

бо указатель, ссылающийся на размещенную в динамической памяти

переменную:

type

PHourly = ^THourly;

var

StatHourly: THourly; { готово }

DynaHourly: PHourly; { перед использованием память должна

выделяться с помощью New }

Наследование распространяется на любые объекты, в том числе и на объекты-потомки: если в качестве родителя указано имя объекта, который сам по себе является потомком, новый объект наследует все свойства своего родителя и все свойства своих прародителей. Таким образом, наследование обеспечивает создание дерева родственных объектов.

Как и любое другое дерево, дерево объектов имеет «корень» – объект, являющийся прародителем всех других объектов иерархии, и «ветви» -порожденные от него потомки. По мере передвижения от корня к ветвям и перехода с ветви на ветвь объекты разрастаются в своих размерах, присоединяя к себе все новые и новые поля и методы. Если иерархия объектов хорошо продумана, на каждом ее уровне к объекту-родителю добавляются только необходимые поля и методы, поэтому в таком разрастании на самом деле нет ничего плохого. Более того, компоновщик Турбо Паскаля тщательно проверит откомпилированную программу и удалит из нее все лишнее – в том числе в исполняемую программу (ЕХЕ-файл) не будут включены методы, которые по каким-либо причинам не используются в программе.

Вопрос 5. Область действия метода и параметр Self. Формальные параметры методов.

TEmployee может содержать

оператор GetTitle := Title без какого-либо квалификатора перед

Title. И именно поэтому Title принадлежит тому объекту, который

вызывает метод. Если объект вызывает метод, то выполняется неяв-

ный оператор with myself do method, связывающий объект и его ме-

тоды в области действия.

Неявный оператор with выполняется путем передачи невидимого

параметра методу всякий раз, когда этот метод вызывается. Этот

параметр называется Self и в действительности является 32-разряд-

ным указателем на экземпляр объекта, осуществляющего вызов мето-

да. Относящийся к TEmployee метод GetRate приблизительно эквива-

лентен следующему:

function TEmployee.GetRate(var Self: TEmployee): integer;

begin

GetRate := Self.Rate;

end;

Примечание: Синтаксически этот пример не совсем кор-

ректен. Он приведен только затем, чтобы дать вам более пол-

ное представление о специфической связи между объектом и

его методом.

Но важно ли вам знать о существовании параметра Self? Обычно

нет. Генерируемый Borland Pascal код выполняет все это автомати-

чески. Однако в некоторых немногочисленных случаях вы можете за-

хотеть проникнуть внутрь метода и использовать параметр Self яв-

но.

Примечание: Явное использование параметра Self допуска-

ется, но вы должны избегать ситуаций, в которых это требует-

ся.

Параметр Self является частью физического кадра стека при

всех вызовах методов. Методы, используемые как внешние на языке

Ассемблера, должны учитывать Self при получении доступа к пара-

метрам метода в стеке.

Выводом из того факта, что методы и их объекты разделяют об-

щую область действия, является то, что формальные параметры мето-

да не могут быть идентичными любому из полей данных объекта. Это

является не каким-то новым ограничением, налагаемым объектно-ори-

ентированным программированием, а скорее теми же самыми старыми

правилами области действия, которые Паскаль имел всегда. Это то

же самое, что и запрет для формальных параметров процедуры быть

идентичными локальным переменным этой процедуры:

procedure CrunchIt(Crunchee: MyDataRec,

Crunchby, ErrorCode: integer);

var

A, B: char;

ErrorCode: integer;

begin

Локальные переменные процедуры и ее формальные параметры

совместно используют общую область действия и поэтому не могут

быть идентичными. Вы получите сообщение "Error 4: Duplicate

identifier" (Ошибка 4; Повторение идентификатора), если попытае-

тесь компилировать что-либо подобное, та же ошибка возникает при

попытке присвоить формальному параметру метода имени поля объек-

та, которому данный метод принадлежит.

Обстоятельства несколько отличаются, так как помещение заго-

ловка процедуры внутрь структуры данных является намеком на нов-

шество в Турбо Паскале, но основные принципы области действия

Паскаля не изменились.