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

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

Содержание


2.5.Создание библиотек классов
Unit ; Interface
Begin {раздел инициализации} {вызовы конструкторов экспортируемых объектов} End
Пример 2.26. Размещение описания класса в модуле
Следует иметь в виду, что только после создания модуля Obj_unit.tpu скрытые поля и методы с помощью директивы private будут недо
Field identifier expected
Подобный материал:
1   ...   9   10   11   12   13   14   15   16   ...   39
^

2.5.Создание библиотек классов


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

В случае, когда модуль В использует модуль А, модуль В может определять производные классы от любого класса, экспортируемого модулем А.

Созданные модули могут поставляться в виде подключаемых (.tpu) файлов с распечаткой классов, их полей и методов, определенных в интерфейсном разделе модуля. Пользователи такого модуля могут, используя механизмы наследования и полиморфизма, создавать на его основе новые классы.

Библиотека может экспортировать не только классы, но и объекты этих классов. Если необходимо экспортировать объекты, содержащие виртуальные методы, то для таких переменных в разделе инициализации можно разместить вызовы конструкторов.

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

Все, что объявлено после директивы private становится недоступным извне. Использование только данной директивы накладывает ограничения на последовательность описания классов, где используются как общедоступные, так и скрытые поля и методы.

Чтобы описание класса сделать более гибким, используют директиву public. Данная директива делает поля и методы класса общедоступными вне модуля Unit.

Структура модуля с описанием класса и экспортируемых объектов выглядит следующим образом:

^ Unit <имя модуля>;

Interface {интерфейсный раздел}

Type

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

private ;

public <доступные поля>;

private <скрытые методы>;

public <доступные методы>;

End;

Var <объявление экспортируемых объектов класса>

Implementation {раздел реализации}

{реализация методов}

^ Begin {раздел инициализации}

{вызовы конструкторов экспортируемых объектов}

End.

Рассмотрим пример, в котором описание класса размещается в модуле.

^ Пример 2.26. Размещение описания класса в модуле

Для демонстрации используем пример 2.7, в котором:

1) описание класса вынесем за пределы основной программы в отдельный модуль Unit;

2) с помощью директивы private скроем динамическое поле А (вектор атрибутов окна) метод ColorWin класса WinD.

^ Следует иметь в виду, что только после создания модуля Obj_unit.tpu скрытые поля и методы с помощью директивы private будут недоступны пользователям.

Unit Obj_Unit;

Interface {интерфейсный раздел}

Uses Crt;

Type

Vaw = array [1..6] of byte;

APtr = ^Vaw; {указатель на массив}

WinPtr = ^WinD; {указатель на объект}

WinD = Object

private {скрытое поле} A:APtr; {вектор атрибутов окна}

public {общедоступные методы}

Constructor Init(An:Vaw); {конструктор}

Destructor Done; Virtual; {деструктор}

Procedure MakeWin; {изображение окна}

private {скрытый метод}

Procedure ColorWin; {установка цвета фона и символов}

End;

Implementation {раздел реализации методов}

Constructor WinD.Init;

Begin New(A); if A=nil then begin WinD.Done; Fail end;

A^:=An;

End;

Destructor WinD.Done;

Begin if A<>nil then Dispose (A); End;

Procedure WinD.MakeWin;

Begin Window(A^[1],A^[2],A^[3],A^[4]); Self.ColorWin End;

Procedure WinD.ColorWin;

Begin TextbackGround(A^[5]); TextColor(A^[6]); Clrscr End;

End.

Текст основной программы, использующий модуль ObjUnit:

Program ModOb;

Uses ObjUnit; {подключение созданного модуля}

Var

V :WinPtr ; {указатель на динамический объект}

A :Vaw; {вектор атрибутов окна}

Begin

A[1]:=1; A[2]:=1; A[3]:=80; A[4]:=25; {координаты окна}

A[5]:=7; A[6]:=1; {цвет фона и символов}

New(V,Init(A)); {размещение динамического объекта}

if V=nil then Halt(2);

V^.MakeWin; {Применение доступных методов}

Dispose(V,Done) {освобождение объекта и полей}

End.

Попытка обратиться непосредственно к полям класса с помощью составных имен, например для их инициализации:

V^.A^[1]:=1; V^.A^[2]:=1; V^.A^[3]:=60;

V^.A^[4]:=20; V^.A^[5]:=3; V^.A^[1]:=2;

приведет к ошибке 44 (^ Field identifier expected – «ожидается имя поля или метода класса»). Обусловлено это тем, что стандартная директива private делает недоступными поля класса WinD из основной программы примера 2.7.

Аналогичная ошибка обнаружится при прямом обращении:

V^.ColorWin;

Метод ColorWin будет также недоступен из основной программы, как и поля класса Win. С другой стороны, данный метод можно использовать внутри модуля, в частности в методе MakeWin.