Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать
      1. Понятие “объект”

Объект объединяет в себе описание данных и программ их обработки. Программы, включаемые в объекты, могут быть реализованы в виде:

Процедур;

Функций;

Конструкторов;

Деструкторов;

В литературе по ООП принято называть программы в составе объекта методами. Таким образом:

объект = данные + методы

Объекты в Turbo Pascal должны быть описаны в разделе типов. В разделе описания переменных задаются экземпляры объектов или, другими словами, переменные типа объект. Разница между описанием объекта как типа и описанием переменной типа “объект” аналогична соотношению тип – переменная для других данных.

Рассмотрим простейший объект:

Type

Location=object

X,Y:integer;

Procedure Init(NewX,NewY:integer);

End;

Procedure Location.Init(NewX,NewY:integer);

Begin

X:=NewX; {поле Х объекта Location}

Y:=NewY; {поле Х объекта Location}

End;

Для описания объектов используется ключевое слово object; внешне описание объекта подобно описанию записей. Объект Location в качестве данных включает в себя две переменных целого типа X и Y и один метод, заданный процедурой Init. Переменные NewX и NewY являются формальными параметрами процедуры Init, а не данными объекта. Тексты методов задаются за пределами объектов, поэтому в описании необходимо уточнить к какому объекту они относятся. В нашем случае необходимо писать Location.Init. Location – это тип и непосредственно выполнять с ним операции невозможно. Можно ввести переменную

Var

MyLoc:Location;

После этого описания допустимо MyLoc.Init(18,32) т.е. – инициализация объекта путём вызова процедуры Init экземпляра объекта MyLoc, в результате которой переменные X,Y экземпляра объекта MyLoc получат значения 18 и 32. Каждый экземпляр объекта имеет собственные поля памяти для всех переменных и передача между ними значений по умолчанию не происходит. Допускается прямое обращение к переменным объекта. В нашем примере выполнение одного из следующих двух вариантов программы дало такой же результат, как вызов процедуры MyLoc.Init

MyLoc.X:=18;

MyLoc.Y:=32;

With MyLoc Do begin

X:=18;

Y:=32;

End;

Методика ООП не рекомендует прямые обращения к данным. Данные объектов желательно обрабатывать только методами того же объекта.

Свойства ООП

Характерные свойства ООП:

Инкапсуляция (упрятывание);

Наследование;

Полиморфизм.

Инкапсуляция – сочетание данных с процедурами и функциями для их обработки в новый тип – объект.

Наследование – определение объекта с последующим формированием иерархической структуры из подчинённых ему объектов. Каждый подчинённый объект имеет доступ к данным, процедурам и функциям вышестоящего объекта.

Полиморфизм – в вышестоящем и подчинённом объектах могут быть процедуры (функции) с одним именем, но разными реализациями. Каждый объект использует свою реализацию. Полиморфизм рассмотрим в следующем параграфе.

Как было сказано выше, согласно методике ООП нежелательны прямые обращения к данным, особенно с целью изменения их значений. Данные объекта должны обрабатываться методами. Это и есть инкапсуляция. Кроме того, детали реализации методов несущественны для пользователей. С помощью описателя Private можно часть данных и методов объекта сделать недоступными извне:

Type

NewObject = object

Public

описание данных {открытая часть}

описание методов {открытая часть}

Private

описание данных {закрытая часть}

описание методов {закрытая часть}

end;

К закрытым данным и методам могут иметь доступ только другие методы этого же объекта.

Наследование реализуется путём указания в описании объекта имени его объекта – предшественника (только одного), таким образом, допускается только древовидная структура. Рассмотрим это на примере.

Type

Location = object

X,Y:integer;

Procedure Init(InitX,InitY:integer);

Function GetX:integer;

Function GetY:integer;

End;

Point = object (Location) {задано имя предшественника}

Visible:Boolean;

Procedure Init(InitX,InitY:integer);

Procedure Show;

Procedure Hide;

Function IsVisible:Boolean;

Procedure MoveTo(NewX,NewY:integer);

End;

Объект Point имеет три поля данных X, Y, Visible. Функции GetX, GetY возвращают текущее значение X, Y. Процедура Show делает точку с заданными координатами видимой, процедура Hide “гасит” точку; функция IsVisible показывает, видима точка или нет. Фрагмент программы показывает точку Х с координатами (0,0):

Var AP:Point;

. . . .

With AP Do

Begin

Init (0,0);

Show;

End;

При создании древовидных структур объектов важно иметь в виду, что недопустимо повторно объявлять в подчинённом объекте данные объекта-предшественника, независимо от того, меняются при этом их атрибуты или нет. Переопределение методов допускается. Если одному и тому же имени в связанных между собой объектах соответствуют разные методы, то вызов осуществляется в зависимости от того, с каким объектом работают.

Продолжим начатый пример (в принципе, число уровней иерархии не ограничено). Приведём методы объявленных выше объектов.

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

Begin

X:=InitX;

Y:=InitY;

End;

Function Location.GetX:integer;

Begin

GetX:=X;

End;

FunctionLocation.GetY:integer;

Begin

GetY:=Y;

End;

Procedure Point.Init(InitX,InitY:integer);

Begin

Location.Init(InitX,InitY);

End;

Procedure Point.Show;

Begin

PutPixel(X,Y,GetMaxColor);

Visible:=true;

End;

Procedure Point.Hide;

Var

TempColor:Word;

Begin

Visible:=false;

Graph.PutPixel(X,Y,GetBkColor);

End;

Function Point.IsVisible:Boolean;

Begin

IsVisible:=Visible;

End;

Procedure Point.MoveTo(NewX,NewY:integer);

Begin

Hide;

X:=NewX;

Y:=NewY;

Show;

End;

Новый объект

Type

Circle = object(Point)

Radius:integer;

Procedure Init(InitX,InitY:integer;InitRadius:integer);

Procedure Show;

Procedure Hide;

Procedure Expand(ExpandBy:integer);

Procedure MoveTo(NewX,NewY:integer);

Procedure Contract(ContractBy:integer);

End;

Procedure Circle.Init(InitX,InitY:integer; InitRadius:integer);

Begin

Point.Init(InitX,InitY);

Radius:=InitRadius;

End;

Procedure Circle.Show;

Begin

Visible:=true;

Graph.Circle(X,Y,Radius); {рисовать круг}

End;

Procedure Circle.Hide;

Var

TempColor:Word;

Begin

TempColor:=Graph.GetColor;

Graph.SetColor(GetBkColor);

Visible:=false;

Graph.Circle(X,Y,Radius);

Graph.SetColor(TempColor);

End;

Procedure Circle.Expand (ExpandBy:integer);

Begin

Hide;

Radius:=Radius + ExpandBy;

If Radius < 0 Then Radius:=0;

Show;

End;

Procedure Circle.Contract(ContractBy:integer);

Begin

Expand(-ContractBy);

End;

Procedure Circle.MoveTo(NewX,NewY:integer);

Begin

Hide;

X:=NewX;

Y;=NewY;

Show;

End;

Рассмотрим использование описанных объектов

Var

Gd,Gm:integer;

P1:Point;

C1:Circle;

Begin

{инициализация графического режима}

Gd:=Detect;

Graph.InitGraph(Gd,Gm,’’);

If GraphResult <> grOK then Halt(1);

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

P1.Init(50,60); {показать точку}

P1.Show; {с координатами (50,60)}

ReadLn;

C1.Init(50,60,30); {показать окружность}

С1.Show; {с центром в точке (50,60) радиус30}

ReadLn;

P1.Hide; {погасить точку – центр окружности}

ReadLn;

With C1 Do begin {выполнение действий с переменной С1 типа объект Circle}

MoveTo(90,110); {передвигать окружность на новое место радиус прежний}

ReadLn;

Expand(60); {изменить радиус окружности}

End;

ReadLn;

End.

Статические и виртуальные методы.

Полиморфизм.

В языке Turbo Pascal имеются два типа методов статические и виртуальные. Статические методы менее сложные, требуют меньше памяти и выполняются быстрее, однако не позволяют реализовать все преимущества ООП. Используемые в приведённых выше программах методы – статические, т.е. если тип метода не указан, то он считается статическим.