Е. К. Пугачев Объектно-ориентированное программирование Под общей редакцией Ивановой Г. С. Рекомендовано Министерством общего и профессионального образования Российской Федерации в качестве учебник

Вид материалаУчебник

Содержание


2.Средства объектно-ориентированного программирования в языке Borland Pascal 7.0
2.1.Определение классов
Type = object
Begin End
Пример 2.17. Описание класса (класс Окно)
Program WinOb
Writeln(Cf,' - ',GetSizeX,' - ',GetSizeY )
Writeln(Winvar.Cf,' - ', Winvar.GetSizeX,' - ',Winvar.GetSizeY )
Type Rec = Record
Подобный материал:
1   ...   5   6   7   8   9   10   11   12   ...   39
^

2.Средства объектно-ориентированного программирования в языке Borland Pascal 7.0


При разработке языка Borland Pascal 7.0 использована логически завершенная, но самая простая объектная модель. В этой модели отсутствуют специальные средства сокрытия реализации классов и поддержки дополнительных средств и приемов разработки классов (абстракций метаклассов, делегирования и т. д.).

Задача данной главы показать преимущества даже такой упрощенной модели ООП по сравнению с ранее известными подходами в программировании.
^

2.1.Определение классов


Итак, класс в ООП - это структурный тип данных, который включает описание полей данных, процедур и функций, работающих с этими полями данных.

Определение класса в Borland Pascal 7.0 осуществляется в два этапа. На первом этапе описывается структура класса, где указываются: имя класса, поля данных и прототипы (заголовки) методов:

^ Type

<имя класса> = object

<имя поля данных 1> : <тип данных 1>;

. . .

<имя поля данных N> : < тип данных N>;

Procedure <имя метода 1>(<список параметров>);

Function <имя метода 2>(<список параметров>):<тип функции>;

. . .

Procedure <имя метода L>(<список параметров>);

. . .

Function <имя метода M>(<список параметров>):<тип функции>;

End;

Поля данных класса могут быть следующих типов: числового (byte, shortint, word, integer, longInt, real, single, double, extended, comp); логического (boolean); символьного (char); строкового (string); адресного (pointer); типа диапазон; множество; массив; файл (text, file, file of ...); класс; указатель на класс и др.

Методами являются процедуры и функции языка Borland Pascal 7.0. При описании структуры класса указываются только заголовки методов (имя процедуры или функции, список передаваемых параметров, тип функции).

На втором этапе описываются тела методов, причем перед именем метода через точку указывается имя класса, а список параметров и тип функции можно опустить.

Procedure <имя класса>.<имя метода>;

<описание локальных переменных, процедур и функций>

^ Begin <операторы> End;

или

Function <имя класса>.<имя метода>;

<описание локальных переменных, процедур и функций>

Begin <операторы> End;

Данные и методы описываются в одном классе. Такое объявление объединяет данные с процедурами и функциями, манипулирующими этими данными. При этом все данные, описанные внутри класса, автоматически становятся глобальными по отношению к его методам, т.е. общедоступными как для процедур, так и для функций класса.

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

Обращение к полям и методам класса осуществляется с указанием имени переменной (объекта), по аналогии с обращением к полям записи:

1) с использованием составных имен: <имя объекта>.<имя поля> или <имя объекта>.<имя метода>(<список фактических параметров>);

2) с использованием оператора присоединения with:

with <имя объекта> do

begin

... <имя поля> ...

... <имя метода> (<список фактических параметров>) ...

end;

Для инициализации полей объектов можно использовать три способа:

1) инициализировать поля в основной программе операторами присваивания вида: <имя объекта>.<имя поля> := <значение>

2) разработать специальный метод инициализации, который получает список параметров и инициализирует ими поля (такой метод обычно называют Init);

3) использовать типизированные константы вида:

Const <имя объекта> : <имя класса> =

(<имя поля 1> : <значение поля 1>;

<имя поля 2> : <значение поля 2>;

. . .

<имя поля K>:<значение поля K>);

Способ инициализации полей объектов выбирается исходя из особенностей решаемых задач.

^ Пример 2.17. Описание класса (класс Окно)

Пусть требуется описать класс, представляющий окно в текстовом режиме.

Основным методом такого класса может быть процедура изображения окна, которая вызывает стандартные процедуры модуля Crt: Window, Textbackground и Clrscr. Целесообразно добавить два дополнительных метода, позволяющих определять размеры окна.

^ Program WinOb;

Uses Crt;

Type

{Описание структуры класса}

Win = Object {класс Окно}

{Поля класса}

X1,Y1, {координаты верхнего левого угла окна}

X2,Y2, {координаты нижнего правого угла окна}

Cf: byte; {цвет фона}

{Методы класса}

Procedure Init(Xn1,Yn1,Xn2,Yn2,Cfn:byte); {инициализация полей}

Procedure MakeWin; {создание окна}

Function GetSizeX : byte; {определение размера окна по оси X}

Function GetSizeY : byte; {определение размера окна по оси Y}

End;

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

Procedure Win.Init;

Begin X1:=Xn1; Y1:=Yn1; X2:=Xn2; Y2:=Yn2; Cf:=Cfn; End;

Procedure Win.MakeWin;

Begin Window(X1,Y1,X2,Y2); Textbackground(Cf); Clrscr End;

Function Win.GetSizeX;

Begin GetSizeX:=X2-X1+1 End;

Function Win.GetSizeY;

Begin GetSizeY:=Y2-Y1+1 End;

Var Winvar : Win; {объявление объекта}

Begin

with Winvar do {для объекта Winvar выполнить}

begin

Init(1,1,80,25,1); {инициализировать поля объекта}

MakeWin; {вызвать метод изображения окна}

^ Writeln(Cf,' - ',GetSizeX,' - ',GetSizeY ); {вывести размеры окна}

end;

Readkey;

End.

В результате работы программы на экране будет изображено синее окно, в которое будут выведены три числа: код цвета фона и размеры окна (1 - 80 - 25).

Доступ к полям и методам класса осуществляется с помощью оператора присоединения with. Можно было бы использовать с той же целью составные имена:

Winvar.Init(1,1,80,25,1);

Winvar.MakeWin;

^ Writeln(Winvar.Cf,' - ', Winvar.GetSizeX,' - ',Winvar.GetSizeY );

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

^ Type Rec = Record {тип запись}

X,Y : word ; {поля данных записи}

end;

Pos =Object {объявление класса}

X,Y : word; {поля данных класса}

Procedure Init(P : Rec); {метод класса}

end;

Procedure Pos.Init;

Begin

with P do {присоединить имя записи P}

begin

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

Self.X:= X; Self.Y := Y ;

end

End;

Var R:Rec; P:Pos;

Begin R.X:=1; R.Y:=2; {инициализировать поля записи}

P.Init(R); {инициализировать объект}

Write( P.X,’ - ‘,P.Y); {вывести значения полей объекта}

End.