Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по Паскалю 3.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
313.34 Кб
Скачать

2.3. Наследование. Правила наследования

Факт наследования каким-либо объектом характеристик родительского объекта обозначается указанием после ключевого слова OBJECT имени непосредственного родителя, которое заключается в круглые скобки.

Этот объект, по сравнению со своим родительским объектом, может быть расширен как новыми информационными полями, так и новыми методами.

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

Правило 1

Информационные поля и методы родительского типа наследуются всеми его дочерними типами независимо от числа промежуточных уровней иерархии.

Правило 2

Доступ к полям и методам родительских типов в рамках описания любых дочерних типов выполняется так, как будто бы описаны в самом дочернем типе.

Правило 3

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

Правило 4

Дочерний тип может доопределить произвольное число собственных методов и информационных полей.

Правило 5

Любое изменение текста в родительском методе автоматически оказывает влияние на все методы порожденных дочерних типов, которые его вызывают.

Правило 6

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

Пример:

Программа, которая создает птицу, машущую крыльями и перемещающуюся по экрану в зависимости от нажатия на клавиши управления курсором. Создается дочерний объект птицы, который имеет новый метод –изменение размера птицы с помощью коэффициента масштабирования. При нажатии клавиши «пробел»птица уменьшает свои размеры в 3 раза, причем координаты в этот момент не изменяются.

Program DemoObgectStaya;

Uses Graph,CRT;

Type

Mother = object; {Родительский объект}

x,y:integer;

vver,pole,vnis:Pointer;

Mize,Size,Lize,ax1,ay1:integer;

ch:char;

Procedure Draw(xa,ya:integer);

Procedure Mahi(bx,by:integer);

Procedure Polet(ax,ay:integer);

end;

Doter = object(Mother) {Дочерний объект}

Procedure DrawMin(k:real;xa,ya:integer);

end;

Procedure Mother.Draw(xa,ya:integer);

Begin {Рисование и ввод в динамическую память}

SetColor(14); {родительской птицы}

SetFillStyle(1,14);

FillEllipse(xa,ya,10,10);

Line(xa-10,ya,xa-30,ya);

Line(xa+10,ya,xa+30,ya);

Line(xa-30,ya,xa-50,ya-20);

Line(xa+30,ya,xa+50,ya-20);

Size:=ImageSize(xa-50,ya-20,xa+50,ya+20);

GetMem(vver,size);

GetImage(xa-50,ya-20,xa+50,ya+20,vver^);

ClearDevice

FillEllipse(xa,ya,10,10);

Line(xa-10,ya,xa-30,ya);

Line(xa-10,ya,xa+30,ya);

Line(xa-30,ya,xa-50,ya+20);

Line(xa+30,ya,xa+50,ya+20);

Lize:=ImageSize(xa-50,ya-20,xa+50,ya+20);

GetMem(vniz,lize);

GetImage(xa-50,ya-20,xa+50,ya+20,vniz^);

ClearDevice:

end;

Procedure Mother.Mahi(bx,by:integer);

Begin {Задание взмахов птицы}

Mize:=ImageSize(bx,by,bx+100,by+40);

GetMem(pole,mize);

GetImage(bx,by,bx+100,by+40,pole^);

PutImage(bx,by,vver^,1);

delay(70);

PutImage(bx,by,pole^,0);

PutImage(bx,by,vniz^,1);

delay(70);

PutImage(bx,by,pole^,0);

PutImage(bx,by,vniz^,1);

delay(70);

PutImage(bx,by,pole^,0);

end;

Procedure Mother.Polet(ax,ay:integer);

Begin {Управление полетом птицы}

if (ax=0) and (ay=0) then

begin

ax:=ax1;

ay:=ay1;

end;

repeat

if KeyPressed then

begin

ch:=ReadKey;

case ch of

#77:ax:=ax+10;

#75:ax:=ax-10;

#80:ay:=ay+10;

#72:ay:=ay-10;

end;

Mahi(ax,ay);

end;

else Mahi(ax,ay);

until ch=#32;

ax1:=ax;

ay1:=ay;

end;

Procedure Doter.DrawMin(k:real;xa,ya:integer);

Begin {Рисование и ввод в динамическую память}

SetColor(14); {дочерней птицы}

SetFillStyle(1,14);

FillEllipse(xa,ya,round(10/k),round(10/k));

Line(xa- round(10/k),ya,xa- round(30/k),ya);

Line(xa+ round(10/k),ya,xa+ round(30/k),ya);

Line(xa- round(30/k),ya,xa- round(50/k),ya- round(20/k));

Line(xa+ round(30/k),ya,xa+ round(50/k),ya- round(20/k));

Size:=ImageSize(xa- round(50/k),ya- round(20/k),xa+ round (50/k),ya+ round(20/k));

GetMem(vver,size);

GetImage(xa- round(50/k),ya- round(20/k),xa+ round(50/k), ya+ round(20/k),vver^);

ClearDevice

FillEllipse(xa,ya, round(10/k), round(10/k));

Line(xa- round(10/k),ya,xa- round(30/k),ya);

Line(xa- round(10/k),ya,xa+ round(30/k),ya);

Line(xa- round(30/k),ya,xa- round(50/k),ya+ round(20/k));

Line(xa+ round(30/k),ya,xa+ round(50/k),ya+ round(20/k));

Lize:=ImageSize(xa- round(50/k),ya- round(20/k),xa+ round (50/k),ya+ round(20/k));

GetMem(vniz,lize);

GetImage(xa- round(50/k),ya- round(20/k),xa+ round(50/k), ya+ round(20/k),vniz^);

ClearDevice:

end;

Var GrDriver, GrMode,alx,aly:integer;

gol:mother;vorob:Doter;

Begin

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C: |Bp|BGI');

readln;

Gol.Draw(100,100);

vorob.drawmin(3,400,400);

Gol.Polet(100,100);

alx:=Gol.ax1;

aly:=Gol.ay1;

vorob.polet(alx,aly);

CloseGraph;

End.