Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл: Источник:
Скачиваний:
98
Добавлен:
04.03.2014
Размер:
593.92 Кб
Скачать

1.2.Объект и инкапсуляция

В Паскале объект очень похож на запись, которая является упаковкой для соединения нескольких взаимосвязанных элементов данных вместе, под одним именем. Данные определяют свойства объекта. С другой стороны, объект имеет свое поведение, определяемое процедурами и функциями этого объекта.

Инкапсуляция - объединение данных с процедурами и функциями для создания нового типа данных - объекта. Связанные с объектом процедуры и функции называются методами. Таким образом, поля данных объекта - это то, что объект "знает", его методы - это то, что объект делает.

Для описания объектов используется зарезервированное слово OBJECT. Описание объекта помещается в разделе описания типов. Вначале описываются все инкапсулированные в объекте данные, а затем - методы доступа к этим данным. Сами методы при описании объекта не раскрываются, указываются лишь заголовки. Методы описываются ниже по тексту программы.

В рассмотренном ниже примере тип объекта "координаты точки" может быть определен следующим образом:

Type Location = Object

X,Y: Integer; {данные}

Procedure Init(InitX, InitY: Integer); {заголовки методов}

Function GetX: Integer;

Function GetY: Integer;

End;

{описание методов}

Procedure Location.Init(InitX, InitY: Integer);

Begin

X:=InitX;

Y:=InitY;

End;

Function Location.GetX: Integer;

Begin

GetX:=X; {получение координаты Х текущей позиции на экране}

End;

Function GetY: Integer;

Begin

GetY:=Y; {получение координаты У текущей позиции на экране}

End;

1.3. Иерархия объектов и наследование

Предположим, что мы хотим высветить точку на экране в позиции, описанной типом LOCATION. Определим тип POINT, который содержит булевское поле, указывающее, светится ли пиксель в данной позиции. Так как все точки должны содержать позицию, мы говорим, что тип POINT - это тип, порожденный типом LOCATION. POINT наследует все, что имеет LOCATION и добавляет в него нечто новое (признак светимости):

Type Location = Object

X,Y: Integer; {данные}

Procedure Init(InitX, InitY: Integer); {заголовки методов}

Function GetX: Integer;

Function GetY: Integer;

End;

Point = Object(Location)

Visible: Boolean;

End;

В качестве примера построим иерархию объектов Координаты - Точка - Квадрат (Lоcation - Point - Square). Удобно определять объекты в модулях, причем тип объекта описывается в интерфейсной части модуля, а тела процедур-методов типа объекта - в разделе модуля Implementation.

Пример 7.1. Этот модуль определяет объекты Lоcation, Point и Square.

unit obj1_OOP;

interface

uses graph;

type location = object

x,y: integer;

procedure init(X1,Y1:integer);

function getX: integer;

function getY: integer;

end;

point = object(location)

procedure init(X1,Y1:integer);

visible: boolean;

procedure show;

procedure hide;

procedure shift(X1,Y1:integer);

end;

square = object(point)

side: integer;

procedure init(X1,Y1,side1:integer);

procedure show;

procedure hide;

procedure shift(X1,Y1:integer);

procedure explode(Step:integer);

end;

{-----------------------------------------}

IMPLEMENTATION

procedure location.init(X1,Y1:integer);

begin

x:=X1;

y:=Y1;

end; {location.init}

function location.getX:integer;

begin

getX:=x;

end; {location.getX}

function location.getY:integer;

begin

getY:=y;

end; {location.getY}

procedure point.init(X1,Y1:integer);

begin

location.init(X1,Y1);

end; {point.init}

procedure point.show;

begin

visible:=true;

putpixel(x,y,getcolor);

end; {point.show}

procedure point.hide;

begin

visible:=false;

putpixel(x,y,getbkcolor);

end; {point.hide}

procedure point.shift(X1,Y1:integer);

begin

hide;