- •1. Библиотечный модуль Graf
- •1.1. Характеристика графических режимов работы адаптера
- •1.2. Основные процедуры и функции графического модуля
- •Процедура CloseGraph
- •1.3. Изображение линий и точек
- •1.4. Изображение многоугольников
- •1.5. Изображение дуг, окружностей, эллипсов
- •1.6. Краски, Палитры, Заполнения
- •Процедура GetDefaultPalette
- •Процедура SetFillStyle
- •1.7. Вывод текста
- •Задает выравнивание выводимого по отношению к текущему положению указателя или к заданным координатам. Заголовок:
- •Процедура SetUserCharSize
- •Функция TextWidth
- •Функция TextHeight
- •1.8. Координаты. Окна. Страницы
- •Функции GetX и GetY
- •Процедура SetViewPort
- •Процедура SetActivePage
- •1.9. Сохранение и выдача изображений
- •2. Объектно-ориентированное программирование
- •2.1. Основные принципы ооп
- •2.2. Создание объектов
- •2.3. Наследование. Правила наследования
- •2.4. Виртуальные и динамические методы
- •2.5. Отличие виртуальных и динамических методов
- •2.6. Деструкторы
- •Список заданий выпускной квалификационной работы
- •Литература
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.
