- •Московский государственный технический университет
- •Содержание.
- •Предисловие
- •Лабораторная работа №1 Процедурные типы
- •1. Теоретические сведения
- •Var X: real; I: integer;
- •X, y : byte;
- •VarFunc : FuncType;
- •I : integer;
- •2.Задачи для самостоятельного решения
- •Лабораторная работа №2 Модули
- •Теоретическая часть
- •Структура модулей
- •Связь модулей друг с другом
- •ISwap(a,b);
- •Var I, y :integer;
- •2.2. Практическая часть
- •Interface
- •Implementation
- •I: Integer;
- •3. Задачи, для самостоятельного решения
- •Лабораторная работа №3 Меню
- •1. Теоретическая часть
- •Var X,y,I: byte;
- •XUpLeft;
- •Var npos,I: integer;
- •Case npos of
- •Лабораторная работа №4.
- •2.Задачи, для самостоятельного решения:
- •Лабораторная работа № 5 Указатели. Связанные списки
- •1. Теоретические сведения
- •1.1. Указатели
- •1.2. Связные списки записей
- •1.3. Управление связанным списком записей (на примере)
- •1.3.1. Построение списка
- •Var ListOfChecks, CurrentCheck: pCheck;
- •1.3.2. Перемещение по списку
- •Var p: Pint;
- •2. Демонстрационные примеры
- •X1,y1,x2,y2: word;
- •Var npos,I,n,j :integer;
- •3: Begin
- •Interface
- •Задачи 1..4. Создать типизированный файл записей, содержащих сведения о багаже пассажира. Структура записи имеет следующий вид:
- •Var rec, beg, endd, current: pnt;
- •Задача 5. Создать типизированный файл записей, содержащих сведения об автомобиле. Структура записи имеет следующий вид:
- •Var rec, beg, endd, current : pnt;
- •Задача 22. Создать типизированный файл записей, содержащих сведения о книгах. Структура записи имеет следующий вид:
- •1.2.Объект и инкапсуляция
- •1.3. Иерархия объектов и наследование
- •Visible: Boolean;
- •Init(x1,y1);
- •Interface
- •Interface
- •X,y : Integer;
- •Visible : Boolean;
- •Implementation
- •Var Temp : Word;
- •Var Temp : Word;
- •Var gm,gd:Integer;
- •Xp:Point;
- •Xs:Square;
- •Xps:PaintSquare;
- •InitGraph(Gd,Gm,'');
- •2. Демонстрационные примеры
- •X,y:integer;
- •Inherited init(ax,ay);
- •Задача 12. Простые объекты.
- •Задача 14. Простые объекты.
- •Задача 15. Простые объекты.
- •Задача 20. Простые объекты.
- •Задача 21. Простые объекты.
- •Задача 22. Простые объекты.
- •Задача 23. Простые объекты.
- •Задача 25. Простые объекты.
- •Лабораторная работа №8 Статические объекты
- •Теоретическая часть
- •1.1.Вывод точек и линий
- •1.2.Вывод многоугольников
- •Виды закраски определяется константами.
- •1.3.Вывод дуг, окружностей, эллипсов
- •1.4.Вывод текста
- •Демонстрационные примеры
- •Лабораторная работа №9
- •2. Задачи, для самостоятельного решения
- •Лабораторная работа №10
- •1.2. Перенос изображения
- •1.3. Масштабирование изображения
- •1.4. Масштабирование рисунка
- •1.5. Поворот изображения
- •1.5.1.Поворот точки
- •1.5.2. Поворот рисунка
- •1.6. Композиция преобразований
- •2. Демонстрационные примеры
- •X,y:integer;
- •1: CloseGraph;
- •3.Задачи, для самостоятельного решения
- •Лабораторная работа №12 Рубежный контроль №2
- •Задачи, для самостоятельного решения
Init(x1,y1);
show;
end; {point.shift}
procedure square.init(X1,Y1,side1:integer);
begin
side:=side1;
point.init(X1,Y1);
end; {square.init}
procedure square.show;
begin
visible:=true;
rectangle(X-side div 2, X- side div 2, X+side div 2, Y+ side div 2);
end; {sguare.show}
procedure square.hide;
var temp:word;
begin
temp :=getcolor;
setcolor(getbkcolor);
show;
visible:=false;
Setcolor(temp);
end; {sguare.hide}
procedure square.shift(X1,Y1:integer);
begin
hide;
X:=X1;
Y:=Y1;
show;
end; {sguare.shift}
procedure square.explode(step:integer);
begin
hide;
inc(side,step);
show;
end;
end.
Чтобы использовать эти типы объектов и методы, в своей программе достаточно определить экземпляры типа Point и Square:
program ex1_OOP;
uses crt,graph,obj1_OOP;
var gm,gd :integer;
XP :point;
XS :square;
I :word;
Begin
gd:=detect;
InitGraph(gd,gm,'C:\BP\BGI');
if GraphResult<>GrOk then Halt(1);
with XP do
begin
init(100,100);
show;
readln;
shift(200,200);
readln;
hide;
end;
with XS do begin
init(100,100,50);
show;
readln;
shift(200,200);
readln;
for i:= 1 to 20 do
begin
explode(10);
delay(200);
end;
readln;
hide;
end;
closeGraph;
End.
В этом примере инициализируется точка, затем она показывается на экране, перемещается в новое место и прячется. Затем инициализируется квадрат, показывается на экране, в 20 раз увеличивает свои линейные размеры на 5 точек и стирается.
Когда родительский тип определен, наследуемые правила могут быть заменены (а могут и использоваться). Для замены унаследованного правила просто определите новое правило с тем же именем, как и унаследованное, но с другим телом и (при необходимости) с другим набором параметров. Логика компилятора в решении вызовов методов такова: компилятор сначала ищет метод с таким именем, определенный в пределах типа объекта. Тип Square определяет методы с именами Init, Show, Hide, Shift и Explode. Если тип Square должен вызвать один из этих методов, компилятор заменит этот вызов адресом одного из собственных методов объекта Square.
Если методов с таким именем не определено в пределах типа объекта, компилятор переходит вверх, к типу непосредственного прародителя, и ищет метод, имя которого вызвано в пределах этого типа. Если метод с таким именем найден, адрес метода прародителя заменяет имя в исходном коде метода потомка. Если же метод по такому имени не найден, компилятор продолжит поиск метода вверх до следующего прародителя. Если компилятор попадает в самый верхний (первый) тип объекта, он выдает сообщение об ошибке, показывающее, что такой метод не определен.
Пользователь может создавать новых потомков и не имея исходного кода Unit (это важно в коммерческих приложениях). Следующий пример иллюстрирует эту возможность, порождая новый объект PaintSquare (закрашенный квадрат), базируясь только на тексте секции Interface для модуля Obj1_OOP.
Unit obj2_OOP;
Interface
Uses Graph, obj1_OOP;
Type PaintSquare = Object(Square)
SquareColor: Word;
Procedure Init(X1,Y1,Side1,Color:Integer);
Procedure Show;
Procedure Hide;
Procedure Shift(X1,Y1:Integer);
Procedure Explode(Step:Integer);
End;
Implementation
Procedure PaintSquare.Init(X1,Y1,Side1,Color:Integer);
Begin
Square.Init(X1,Y1,Side1);
SquareColor :=Color;
End;
Procedure PaintSquare.Show;
Var Temp : Word;
Begin
Square.Show;
Temp:=GetColor;
SetFillStyle(SolidFill, SquareColor);
FloodFill(X,Y,Temp);
SetColor(Temp);
End;
Procedure PaintSquare.Hide;
Begin
SetFillStyle(SolidFill,GetBkColor);
FloodFill(X,Y,GetBkColor);
Square.Hide;
End;
Procedure PaintSquare.Shift(X1,Y1 : Integer);
Begin
Hide;
Init(X1,Y1,Side,SquareColor);
Show;
End;
Procedure PaintSquare.Explode(Step : Integer);
Begin
Hide;
Inc(Side,Step);
Init(X,Y,Side,SquareColor);
Show;
End;
End.
Используется модуль аналогично предыдущему. В следующем примере инициализируется закрашенный квадрат, затем он показывается на экране, перемещается на новое место и, наконец в 20 раз увеличивает линейные размеры на 5 точек, а затем возвращается в исходное состояние путем последовательного уменьшения.
Program EX2_OOP;
Uses Crt, Graph, obj2_OOP;
var gd,gm : integer;
XPS : PaintSquare;
I : Word;
begin
gd:=Detect;
InitGraph(gd,gm,'C:\BP\BGI');
If graphResult<>GrOk then Halt(1);
With XPS do
Begin
Init(100,100,50,14);
Show;
Readln;
Shift(200,200);
Readln;
For i:=1 to 20 do Begin
Explode(5);
Delay(200);
End;
Readln;
For i:=1 to 20 do Begin
Explode(-5);
Delay(200);
End;
Readln;
CloseGraph;
End;
End.
1.5. Виртуальные методы и полиморфизм
Все методы, которые мы рассматривали до этого, были статическими, т.е. компилятор размещает их и разрешает все ссылки во время компиляции. В Турбо Паскале существует возможность связывания данных с методами на этапе выполнения программы, такое связывание называется поздним. При позднем связывании используются так называемые виртуальные методы. Виртуальные методы реализуют чрезвычайно мощное средство для обобщения, которое называется полиморфизмом.
Полиморфизм - свойство, позволяющее называть разные алгоритмические действия одним именем. Такое действие совместно используется в иерархии объектов, причем каждый объект в этой иерархии реализует это действие своими собственными, пригодными для него способами.
Метод делается виртуальным, когда за его определением в типе объекта ставится служебное (зарезервированное) слово Virtual. Надо запомнить, что, если вы определяете метод в родительском типе как Virtual, все методы с тем же именем в любом из потомков также должны быть описаны как Virtual.
Вот как может произойти виртуализация рассмотренных выше графических объектов:
Unit obj3_OOP;