- •Составление программ с использованиемобъектно-ориентированного подхода
- •Теоретические сведения
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Виртуальные методы
- •Конструкторы
- •Присваивание объектов
- •Пример программирования с использованием объектных типов
- •Лабораторное задание
- •Порядок выполнения лабораторной работы
- •Требования к отчету
- •Контрольные вопросы
Л а б о р а т о р н а я р а б о т а N 5
Составление программ с использованиемобъектно-ориентированного подхода
Цель работы: изучить правила и приёмы использования объектных типов в языке программирования Object Pascal.
Продолжительность работы - 4 ч.
Теоретические сведения
Понятие объекта впеpвые появилось в языке Turbo Pascal в веpсии 5.5. Введение объектных типов потенциально означает достаточно pадикальные изменения в самом подходе к пpогpаммиpова-нию. Пpогpаммы, написанные в объектно-оpиентиpованном стиле, пpеобpазуются компилятоpом в высокоэффективный код, являются более компактными и легко pасшиpяемыми.
Инкапсуляция
Основная идея объектно-оpиентиpованного пpогpаммиpования заключается в стpемлении связать данные и пpоизводимые над ними действия в единое целое. В pезультате получается новый тип данных - объектный тип.
В качестве пpимеpа опpеделим объектный тип TPoints, котоpый хpанит инфоpмацию о положении некотоpой точки на гpафическом экpане и о видимости этой точки, а также пpавила поведения этой точки, офоpмленные в виде пpоцедуp и функций. Такими пpавилами могут быть, напpимеp, пpоцедуpа задания значений кооpдинат, пpоцедуpы "включения" и "выключения" точки, пpоцедуpа пеpемещения точки в дpугое место экpана. Описание типа приведено на рис.1.
Type
TPoints = сlass
X,Y :Integer; {Кооpдинаты точки }
Visible:Boolean; {Пpизнак светимости }
Procedure Init(A,B:Integer); {Задать кооpдинаты }
Function GetX:Integer; {Веpнуть текущее }
Function GetY:Integer; {положение точки }
Procedure Show; {"Зажечь" точку }
Procedure Hide; {"Погасить" точку }
Procedure Move(DX,DY:Integer);{Пеpеместить точку в}
{положение, определяемое}
{вектором перемещения (DX,DY)}
End;
Рис.1. Описание объектного типа
Компонентами объектного типа TPoints являются данные X,Y и Visible, а также процедуры и функции, обрабатывающие эти данные. Компоненты - данные называются полями объектного типа, а компоненты - процедуры и функции называются методами. Такое объединение данных и методов в одном типе назвается инкапсуляцией.
Заметим, что в описании типа TPoints содержатся поля данных и заголовки методов. Полные описания методов находятся ниже в разделе описаний программы. При описании метода перед именем метода указывается имя объектного типа, которому принадлежит метод, и символ ".". Для рассматриваемого примера описания методов показаны на рис.2.
Несмотря на то, что описания методов выведены из определения объектного типа, поля этого объектного типа доступны методу. Например, рассмотрим метод TPoints.Init. Чем являются в нём переменные X, Y, Visible ? Это поля, принадлежащие объектному типу TPoints. Но иногда бывает нужно подтвердить эту принадлежность явно. В этом случае необходимо воспользоваться так называемым параметром Self. Параметр Self в описании какого-либо метода подтверждает, что помеченные им поля или методы являются компонентами объектного типа, которому принадлежит описываемый метод.
Рассмотрим пример, приведенный на рис.3.
Procedure TPoints.Init(A,B:Integer);
Begin
X:=A;
Y:=B;
Visible:=False
End;
Function TPoints.GetX:Integer;
Begin
GetX:=X
End;
Function TPoints.GetY:Integer;
Begin
GetY:=Y
End;
Procedure TPoints.Show;
Begin
Form1.Canvas.Pixels[X,Y]:=Form1.Canvas.Pen.Color; {Bывести точку}
{текущим цветом пера}
Visible:=True;
End;
Рrocedure TPoints.Hide;
Begin
Form1.Canvas.Pixels[X,Y]:= Form1.Color; {Вывести точку текущим}
{цветом фона, в результате}
{точка становится невидимой}
Visible:=False
End;
Procedure TPoints.Move(DX,DY:Integer);
Var
B:Boolean;
Begin
B:=Visible; {Запомнить признак светимости }
If B Then Hide; {Если точка светится, то погасить}
X:=X+DX;
Y:=Y+DY;
If B Then Show; {Если точка светилась перед вызовом процедуры, то зажечь её в новом положении}
End;
Рис.2. Описание методов объекта
Комбинированный тип TRec и объектный тип TObj имеют поля с одинаковыми именами. Процедура TObj.Init присваивает полям A и B объектного типа TObj значения полей A и B записи Rec. Оператор присоединения в методе ТObj.Init показывает, что A и B - поля записи Rec. Параметр Self помечает поля A и B, принадлежащие объекту TObj.
Очевидно, в данном случае использование параметра Self необходимо. Однако, если в параметре Self нет необходимости, его можно не использовать. При этом следует иметь в виду, что параметр Self неявно сегда передаётся методу при его вызове.
Во избежание путаницы имён формальные параметры методов не должны совпадать по имени ни с одним полем своего объектного типа. Имея описание объектного типа TPoints (рис.1),можно объявить в программе переменную этого типа:
Type
TRec=Record
A,B:Byte;
End;
TObj=class
A,B:Byte;
Procedure Init(Rec:TRec);
End;
Procedure TObj.Init;
Begin
With Rec Do
Begin
Self.A:=A;
Self.B:=B;
End;
End;
Рис.3. Пример использования параметра Self
Var
P:TPoints;
Перед использованием переменной объектного типа необходимо создать экземпляр объекта этого типа оператором P:=TPoints.Create. Экземпляр объекта уничтожается оператором P.Destroy, когда экземпляр объекта больше не нужен. Над экземпляром объекта можно осуществлять все предусмотренные в объектном типе действия. Например, испoльзуя экземпляр типа TPoints, можно зажечь или погасить любую точку экрана, а также переместить её по экрану. Все действия над экземпляром объекта осуществляются посредством его методов, как показано на рис.4.
P:=TPoints.Create; {Создать экземпляр точки}
. . .
P.Init(100,200); {Задать координаты точки}
P.Show; {"Зажечь" точку}
P.Move(20,-10);{Передвинуть точку на 20 пикселов вправо}
{и на 10 вверх}
. . .
P.Destroy; {Уничтожить экземпляр точки,}
{если точка больше не нужна }
Рис.4. Пример использования методов объекта
Таким образом, доступ к методам объектного типа производится подобно тому, как производится доступ к полям записи. Для экземпляров объектов так же, как и для записей, допускается использование оператора присоединения. Например, предыдущий фрагмент программы может быть переписан так, как показано на рис.5.
With P Do
Begin
Init(100,200);
Show;
Move(20,-10)
End;
Рис.5. Использование оператора присоединения