<<
>>

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

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

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

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

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

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

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

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

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

Unit ;

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

ТУре

= object

private ; public ; private ; public ;

End;

Var объявление экспортируемых объектов класса> Implementation {раздел реализации}

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

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

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

End.

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

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

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

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

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

Unit ObjJUnit;

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

Uses Crt;

Type

Vow = array [1..6J of byte;

APtr - AVaw; {указатель на массив}

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

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; AA:=An;

End;

Destructor WinD.Done;

Begin if Anil then Dispose (A); End;

Procedure WinD.MakeWin;

Begin Window(AA[l],AA[2J,AA[3]lAA[4]); Self ColorWin End; Procedure WinD.ColorWin;

Begin TextbackGround(AA[5j); TextColor(AA[6J); Clrscr End; End.

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

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

Var

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

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

Begin

А[1]:=1; А[2]:=1; А[3]:=80; А[4]:=25; {координаты окна} А[5]:=7; А[6]:-1; {цвет фона и символов}

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

ifV=nil then Halt(2);

VA.MakeWin; {применение доступных методов} Dispose(VDone) {освобождение объекта и полей}

End.

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

УЛЛ[1]:=1; УЛЛ[2]:=1; УЛЛ[3]:=60;

УЛЛ[4]:=20; УЛЛ[5]:=3; УЛЛ[1]:=2;

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

VA.ColorWin;

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

2.6.

<< | >>
Источник: Г.С.Иванова, Т.Н.Ничушкина, Е.К.Пугачев. Объектно- ориентированное программирование. 2001

Еще по теме Создание библиотек классов:

  1. 14.6. Организация взаимодействия библиотек
  2. 14.8. Авторское право в деятельности библиотек
  3. Телос, живая библиотека Приветствую вас, друзья.
  4. Издания Ф. В. Булгарина и Н. И. Греча и журнал «Библиотека для чтения»
  5. Статья 305. Право на ознакомление с личными бумагами, переданными в фонд библиотек или архивов
  6. ПЯТЫЙ КЛАСС
  7. Школьный класс
  8. Одиночки в классе
  9. ПЕРВЫЙ КЛАСС
  10. 6.3. Женщина высшего класса
  11. 5. Критическая теория и рабочий класс.
  12. Глава 13. INTJ «Компетентность + независимость = высший класс»
  13. Масса, демократия и рабочий класс
  14. СРАВНИТЕЛЬНАЯ СИСТЕМА КЛАССОВ
  15. ПОТЕНЦИАЛЬНЫЕ ВОЗМОЖНОСТИ ШКОЛЬНОГО КЛАССА КАК ГРУППЫ