
- •15. Основы объектно-ориентированного программирования
- •15.1. Основные понятия
- •15.2. Объявление классов объектов
- •15.3. Статические и динамические объекты
- •15.4. Правила построения и использования объектов а. Правила наследования
- •Б. Виртуальные методы
- •В. Ранее и позднее связывание
- •Г. Совместимость классов объектов
- •Вопросы для самоконтроля
15.4. Правила построения и использования объектов а. Правила наследования
Информационные поля и методы родительского типа наследуются всеми дочерними типами независимо от числа промежуточных уровней иерархиии.
Доступ к полям и методам родительских типов для дочерних выполняется так, как будто бы они описаны в самом дочернем типе.
Ни в одном из дочерних типов не могут использоваться идентификаторы полей, совпадающие с идентификаторами полей каких-либо родительских типов. Это же относится и к идентификаторам формальных параметров, указанным в заголовках методов.
Дочерний тип может доопределить произвольное число собственных методов и информационных полей.
Любое изменение текста в родительском методе автоматически оказывает влияние на все методы порожденных дочерних типов, которые его вызывают.
В противоположность информационным полям (правило 3) идентификаторы методов в дочерних типах могут совпадать с именами методов в родительских типах. В этом случае дочерний метод подавляет одноименный ему родительский, вследствие чего для объекта дочернего типа будет вызываться метод именно дочернего, а не родительского типа. В то же время остается и возможность вызова родительского типа. Для этого необходимо использовать квалифицированный (уточненный) идентификатор, в котором перед именем метода помещается имя требуемого родительского класса. Пример записи квалифицируемого идентификатора – TPoint.Show.
Б. Виртуальные методы
Виртуальными следует обявлять те методы, которые изменяются в классе-потомке.
Если метод одного из классов в иерархии объявлен как виртуальный, то все классы иерархии долны также объявить его виртуальным.
Список формальных параметров любого виртуального метода во всей иерархии должен совпадать и по типам и по именам параметров.
В. Ранее и позднее связывание
Ранее связывание – процесс, в результате которого вызовы статических правил однозначно разрешаются компилятором во время трансляции метода.
Позднее связывание: вызывающий и вызываемый методы не могут быть связаны во время компиляции. Их связывание происходит в момент вызова. Это обеспечивается за счет создания (автоматического) так называемой таблицы виртуальных методов.
Г. Совместимость классов объектов
С
var point
: PPoint; circle
: PCircle; rect
: PRect; txt
: PText; begin допустимо
недопустимо point
:= circle; circle := point; rect
:= txt; txt := rect; point
:= txt;
Следствие этого: имеется возможность включить объекты разных классов одной и той же иерархии в один список, при условии, что в качестве указателя на объект элемента списка указан тип указателя на прародителявсей иерархии классов. Пример использования этой возможности для объекта классаTTextприведен на следующей странице. В нем объект данного класса включается в список, элеменами которого могут быть объекты из классов, принадлежащих всей еиерархии, начиная от объектов классаTPoint.
Type Pitem
= ^Titem; TItem=record Info
: PPoint; {указатель
на объект класса
TPoint} pred,
next :Pitem; end;
procedure
Add(var
Head:Pitem; p:Pitem); begin .
. . . end; var
Head:Pitem; newItem:Pitem; tt:Ptext;
{ указатель
на объект
TText;
} {
TPoint - для
него прародительский класс
} begin .
. . . Head:=nil; New(tt,
Init(100,100,’Слово',blue)); New(newItem); NewItem^.Info
:= tt; Add(Head,
newItem); .
. .