Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / DELPHI / ВМИПЛаб5.rtf
Скачиваний:
13
Добавлен:
16.04.2013
Размер:
179.37 Кб
Скачать

Л а б о р а т о р н а я р а б о т а 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),можно объявить в программе переменную этого типа:

Var

P:TPoints;

Перед использованием переменной объектного типа необходимо создать экземпляр объекта этого типа оператором P:=TPoints.Create. Экземпляр объекта уничтожается оператором P.Destroy, когда экземпляр объекта больше не нужен. Над экземпляром объекта можно осуществлять все предусмотренные в объектном типе действия. Например, испoльзуя экземпляр типа TPoints, можно зажечь или погасить любую точку экрана, а также переместить её по экрану. Все действия над экземпляром объекта осуществляются посредством его методов, как показано на рис.4.

Type

TRec=Record

A,B:Byte;

End;

TObj=class

A,B:Byte;

Procedure nit(Rec:TRec);

End;

Procedure TObj.Init;

Begin

With Rec Do

Begin

Self.A:=A;

Self.B:=B;

End;

End;

Рис.3. Пример использования параметра Self

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. Использование оператора присоединения

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в папке DELPHI