Указатели, рассматриваемые ранее, являются основой объектно-ориентированного программирования (ООП). ООП построено на использовании структурный единиц под названием «объекты», которые по своей сути напоминают записи. Можно определить, что объект – это некоторая совокупность данных, которая рассматривается как единое целое. Объекты отличаются от записей тем, что к ним применяются три базовых принципа ООП: инкапсуляция, наследование и полиморфизм.
Инкапсуляция – это объединение внутри объекта его данных с процедурами и функциями (подпрограммами), обрабатывающими эти данные. Данные, которые содержит объект, называются полями (аналогично полям записи), а подпрограммы, которые содержат описания обработки данных, – методами.
Рассмотрим пример графического объекта – точки. Описания объекта (как и всех прочих типов) должно содержаться в разделе описаний:
Type dot = object
x,y: integer;
procedure Init(a,b: integer); {Инициализация,
т.е. задание начальных значений}
procedure show; {показать точку}
procedure hide; {скрыть точку}
procedure move(Dx,Dy: integer); {задать новые
координаты}
end;
В данном примере x и y являются полями, содержащими координаты точки, а Init, show, hide и move – методами, выполняющими над объектом допустимые действия. Важно, что описания полей должны всегда предшествовать описаниям методов.
Заметим, что в описании объекта содержатся только заголовки подпрограмм, а тело каждой подпрограммы (метода) описывается отдельно (в разделе описания подпрограмм). Кроме того, при описании методов необязательно дублировать параметры, т.к. они уже были заданы в заголовках методов при определении типа. Вот как будет выглядеть полное описание объектного типа dot:
Type dot = object
x,y: integer;
procedure Init(a,b: integer); {Инициализация,
т.е. задание значений}
procedure show; {показать точку}
procedure hide; {скрыть точку}
procedure move(Dx,Dy: integer); {задать новые
координаты}
end;
procedure dot.Init(a,b:integer);
begin
x:=a;
y:=b;
end;
procedure dot.show;
begin
PutPixel(x,y,white);
end;
procedure dot.Hide;
begin
PutPixel(x,y,black);
end;
procedure Dot.move;
begin
hide;
x:=x+Dx; y:=y+Dy;
show;
end;
После того, как объектный тип объявлен, можно создавать переменные этого типа, или если пользоваться терминологией ООП – экземпляры объекта:
Var dot1: dot;
Dot1 – статическая переменная (экземпляр объекта), принадлежащая типу dot. После того, как экземпляр объекта создан, его поля становятся доступны для методов, хотя к полям объекта возможен доступ и непосредственный доступ как полям записи. Например, операторы
dot1.x:=100; dot1.y:=100;
являются допустимым. Однако такой подход был бы отступлением от принципов объектно-ориентированного программирования. Объектно-ориентированный подход при манипулировании полями объекта предполагает использование только его методов.
dot1.Init(100,100);
dot1.show;
dot1.move(5,-5);
Так же как и к записям, к объектам применим оператор присоединения:
With dot1 do
Begin
Init(100,100);
show;
move(5,-5);
End;
Ниже представлен текст программы, демонстрирующий использование объекта. Данная программа отображает на экране светящуюся точку (пиксел). Кроме того, ее можно перемещать по экрану в четырех направлениях с помощью соответствующих клавиш-стрелок.
program ex_object1;
uses crt,graph;
type dot = object
x,y: integer;
procedure Init(a,b: integer);
procedure show;
procedure hide;
procedure move(Dx,Dy:integer);
end;
procedure dot.Init(a,b:integer);
begin
x:=a;
y:=b;
end;
procedure dot.show;
begin
PutPixel(x,y,white);
end;
procedure dot.Hide;
begin
PutPixel(x,y,black);
end;
procedure Dot.move;
begin
hide;
x:=x+Dx; y:=y+Dy;
show;
end;
Var i,j,err:integer;
c:char;
dot1:dot;
begin
i:=detect;
InitGraph(i,j,'');
err:=GraphResult;
if err<>0 then
writeln(graphErrorMsg(err))
else
begin
setcolor(yellow);
OutTextXY(getMaxX div 4,GetMaxY-30, concat( chr(24), chr(25),chr(26),chr(27), ' - move; ESC, Enter - exit'));
setcolor(white);
dot1.init(100,100);
dot1.show;
repeat
c:=readkey;
if c=#0 then
begin
c:=readkey;
with dot1 do
case c of
#72: move(0,-5);
#80: move(0,5);
#77: move(5,0);
#75: move(-5,0);
End {case}
end; {if c=#0}
until (c=#27) or (c=#13);
end; {else err<>0}
end.
|