
Лабораторная работа №1 Описание объекта
Для описания объекта используется синтаксис, аналогичный описанию записи: type <имя объекта>=object
<список имён полей>: <тип полей>;
....
<список имён полей>: <тип полей>;
<объявление метода>
...
<объявление метода>
end;
Описание метода аналогично предварительному описанию функции (служебное слово forward не используется).
После описания объекта описываются методы: procedure <имя объекта>.<имя метода> <параметры>
<описание процедуры>
Аналогично можно описать и метод-функцию. Методы (также как и обычные подпрограммы) могут не иметь параметров. Так как методы предназначены для работы с экземплярами объектов в них определена служебная переменная Self, являющаяся псевдонимом для текущего экземпляра (фактически Self - это скрытый параметр). Например, обращение к полю x из метода производится так: self.x. Если в методе нет одноимённой локальной переменной, к полям можно обращаться по названию, опуская Self и точку.
Первый пример
Приведём реализацию объекта "окно" (для реализации интерфейса с помощью модуля crt). Мы можем считать, что окно задаётся координатами левого верхнего угла и размерами по горизонтали и вертикали (с учётом рамки окна), а также иметь флаг видимости (true означает, что окно на экран выведено). type СWindow=object
x,y: integer; {координаты окна}
lenx,leny: integer; {размеры окна}
visible: boolean; {флаг видимости}
procedure Init (x,y,lenx,leny: integer);
procedure Show;
function isVisible: boolean;
end;
procedure СWindow.Init (x,y,lenx,leny: integer);
{Задаёт начальные параметры окна}
begin
Self.x:=x;
Self.y:=y;
Self.lenx:=lenx;
Self.leny:=leny;
visible:=true;
end;
procedure СWindow.show;
{Рисует окно}
var i,j: integer;
begin
textbackground (BLUE);
gotoxy (x,y);
write ('╔'); {ALT+201}
for i:=1 to lenx-2 do write ('═'); {ALT+205}
write ('╗') {ALT+187}
for j:=y+1 to y+leny-2 do
begin
gotoxy (x,j);
write ('║'); {ALT+186}
for i:=1 to lenx-2 do write (' '); {ALT+205}
write ('║'); {ALT+186}
end;
gotoxy (x,y+leny-1);
write ('╚'); {ALT+200}
for i:=1 to lenx-2 do write ('═'); {ALT+205}
write ('╝') {ALT+188}
visible:=true;
end;
function CWindow.isVisible: boolean;
begin
isVisible:=visible;
end;
Для создания экземпляра данного объекта можно использовать стандартные способы объявления переменных и создания динамических переменных. var Window:CWindow;
begin
Window.Init (20,5,40,10);
Window.Show;
end.
Лабораторная работа №2 Наследование
Важнейшим элементом объектно-ориентированного стиля является наследование. Если вспомнить уже приводившийся пример с телевизором, то наследование можно проиллюстировать, рассмотрев новый "объект" - видеодвойку, которая наследует от телевизора все его свойства, но в ней также есть и новые. Также наследуюстя и методы (хотя, некоторые из них изменяются: при включении, например, надо активировать не только телевизор, но и плеер). Для видеодвойки характерны и свои собственные методы.
Наш пример класса CWindow можно расширить, создав новый класс CWindowText, который будет соответствовать окну с текстом (состоящим ровно из одной строки). В этом случае надо будет изменить методы. Ситуацию введения нового метода, который будет иметь тоже название, что и унаследованный мы будем называть переопределением.
Приведу описание нового объекта: type CWindowText=object(CWindow);
str: string;
procedure Init (x,y,lenx: integer, str: string);
procedure Show;
end;
procedure CWindowText.Init (x,y,lenx: integer, str: string);
begin
CWindow.Init (x,y,lenx,3);
Self.str:=str;
end;
procedure CWindowText.Show;
begin
CWindow.Show;
gotoxy (x+1,y+1);
write (str);
end;
Отмечу, что наследование отражается в тексте программы указанием в скобках родительского объекта после слова object. При этом методы родительского объекта можно вызывать, указывая явно имя объекта, которому принадлежит метод.