Свойство наследования.

Свойства наследования и полиморфизма

Математическая модель.

Постановка задачи.

Пример объектного типа.

Структура объявления объектного типа.

TYPE

<имя_типа>=OBJECT

<имя_поля>:<тип_поля>;

<методы>;

END;

После объявления типа объекта должны следовать определения всех методов, перечисленных в объектном типе, которые представляют собой тексты процедур и функций. Отличие от обычного определения заключается в том, что имя подпрограммы, являющейся методом объекта, указываемое в её заголовке, состоит из 2 частей:

<имя_типа>.<имя_подпрограммы>

Реализовать движение точки на экране.

Каждая точка на экране характеризуется координатами x, y и состоянием v –видима/невидима.

3. Объявление объектного типа POINT:

type

POINT=object

X, Y: integer; {координаты}

V: boolean; {признак видимости: TRUE-видима; FALSE-невидима}

function GET_X: integer; { получение координаты Х }

function GET_Y: integer; { получение координаты Y }

function GET_V: boolean; { получение признака видимости }

procedure INIT(X0, Y0: integer); { задание координат }

procedure TURN_ON; { рисование точки – получение видимой точки }

procedure TURN_OFF; { стирание точки – получение невидимой точки}

procedure MOVE(XN, YN: integer); { перемещение точки }

end;

4. Определение методов объекта POINT:

function POINT.GET_X; { получение координаты Х }

begin

GET_X:=X;

end;

function POINT.GET_Y; { получение координаты Y }

begin

GET_Y:=Y;

end;

function POINT.GET_V; { получение признака видимости }

begin

GET_V:=V;

end;

procedure POINT.INIT; { задание координат }

begin

X:=X0;

Y:=Y0;

V:=false;

end;

procedure POINT.TURN_ON; { получение видимой точки }

begin

if not V then

begin

PutPixel(X,Y,GetColor); { GetColor возвращает текущий цвет }

V:=true;

end;

end;

procedure POINT.TURN_OFF; { получение невидимой точки – стирание точки }

begin

if V then

begin

PutPixel(X,Y,GetBkColor); { GetBkColor возвращает фоновый цвет }

V:=false;

end;

end;

procedure POINT.MOVE; { перемещение точки }

var

F: boolean;

begin

F:=V;

if F then

TURN_OFF;

X:=XN;

Y:=YN;

if F then

TURN_ON;

end;

5. Использование объекта POINT: в программе должна быть объявлена переменная типа POINT:

var

P: POINT;

Для обращения к методам объекта в программе будут использоваться составные имена: P.INIT(10,20), P.TURN_ON.

При создании типа POINT в ОП создается следующая структура объекта P:

 

INTEGER (X) – 2 б
INTEGER (Y) – 2 б
BOOLEAN (V) – 1 б
@GET_X (адрес – 4 б)
@CET_Y (адрес – 4 б)
@GET_V (адрес – 4 б)

 

@INIT (адрес – 4 б)
@TURN_ON (4 б)
@TURN_OFF (4 б)
@MOVE (4 б)

Структура объекта занимает 33 байта.

Кроме точки, можно задать другие объекты, описывающие геометрические фигуры, например, объект типа окружность, который определяется радиусом, координатой центра, признаком видимости, и с ним возможны такие же действия, как с точкой: получение видимой окружности; получение невидимой окружности; перемещение окружности (изменение координат центра). Чтобы этот объект привязать к координатной сетке экрана, необходимо определить объектный тип PLACE (место), который будет иметь данные, общие для всех геометрических фигур, – координаты привязки объекта к экрану X и Y:

type

PLACE=object

X, Y: integer;

procedure INIT(X0, Y0: integer);

function GET_X: integer;

function GET_Y: integer;

end;

{ далее следует описание методов }

Каждый новый объектный тип может строиться на основе ранее определенного типа, называемого родительским типом, от которого наследуются все поля и методы. Чтобы произошло наследование, в объявлении объектного типа после OBJECT в скобках указывается имя родительского типа.

Правила наследования заключаются в следующем:

· в объявлении типа наследника не должно быть полей, совпадающих по именам с полями родителя; имена методов могут совпадать, в чем проявляется свойство полиморфизма;

· при построении объектного типа наследника, в первую очередь, наследуются поля родителя, затем добавляются поля наследника; после полей наследуются все методы родителя, затем добавляются методы наследника, если их имена не совпадают с именами методов родителя; если совпадения существуют, то это означает, что методы наследника являются полиморфными методами и замещают одноименные методы родителя.

Используя тип PLACE как родительский, можно определить объектный тип POINT таким образом:

type

POINT=object(PLACE)

V: boolean;

procedure INIT(X0, Y0: integer);

function GET_V:boolean;

procedure TURN_ON;

procedure TURN_OFF;

procedure MOVE(XN, YN: integer);

end;

{ далее следует описание методов }

Теперь структура объекта P в ОП будет следующая: