<<
>>

Практикум. Создание контейнеров

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

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

В процессе создания объектов под них отводят память и выполняют инициализацию полей.

Для выполнения последовательной обработки обычно классы объектов строят таким образом, чтобы они включали методы с одинаковыми именами (полиморфные), возможно выполняющие различные действия для объектов различных классов.

Однако при последовательной обработке возможна и проверка типа (класса) конкретного объекта (см. параграф 11.5), и выполнение для него специфических действий.

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

Пример 11.11. Разработать программу, которая осуществляет движение строк по экрану: по горизонтали, по вертикали и по окружности.

В результате объектной декомпозиции получаем объекты четырех типов: управляющий объект и три объекта-строки, различающиеся законами движения (рис.

11.21).

Управляющий объект можно реализовать как основную программу, не строя соответствующий класс.

Чтобы реализовать заданные законы движения, необходимо каждую строку рассматривать как совокупность символов, перемещающихся по од- ной„траектории, но с некоторым смещением. В примере, рассмотренном в параграфе 11.6, уже были разработаны классы, реализующие заданные законы перемещения символов. Используем эти классы для реализации объектов-символов, входящих в объекты-строки. Тогда каждая строка будет представлять собой контейнер, который управляет движением своих символов (рис. 11.22), вызывая их методы Move.

Рис. 11.21. Объектная декомпозиция предметной области программы «Перемещение строк»

Ниже приведен текст программы.

Program ex;

Uses crt, Graph;

Type pChar-ATChar;

{описание абстрактного класса}

TChar-object

ch.char;

x,y:integer;

constructor Init(ach:char;ax, ay: integer); procedure Move(t:integer); procedure Rel(t:integer); virtual;

destructor Done ¡virtual; {деструктор обязателен, так как

объекты динамические полиморфные}

End;

Рис. 11.22. Диаграмма классов программы «Перемещение строк»

Constructor TChar.Init;

Begin

ch: =ach;

x:=ax;

y=ay:

End;

Procedure TChar.Rel;

Begin End;

Procedure TChar.Move;

Begin

SetColor(GetBkColor);

OuttextXYfx,y, ch);

Rel(t); {изменяем координаты}

SetColor(ord(ch) mod 16);

OutTextXYfx,y,ch);

End;

Destructor TChar.Done;

Begin End; {деструктор пустой, так как объект не содержит

объектных полей}

Type pLChar=ATLineChar;

{описание класса символа, перемещающегося по горизонтали}

TLineChar-objectfTChar)

xn.integer;

constructor Init(ach: char;ax, ay: integer); procedure Rel(t:integer); virtual;

End;

Constructor TLineChar.Init;

Begin

inherited Init(ach,ax,ay); xn:=ax;

End;

Procedure TLineChar.Rel;

Begin

x:=(xn+t) mod GetMaxX;

End;

Type pVChar=ATVLineChar;

{описание класса символа, перемещающегося по вертикали}

TVLineChar=object(TChar) уп: integer;

constructor Init(ach:char;ax,ay:integer); procedure Rel(t:integer); virtual;

End;

Constructor TVLineChar.Init;

Begin

inherited Init(ach,ax,ay); yn: =ay;

End;

Procedure TVLineChar.Rel;

Begin

y:=(yn+t) mod GetMaxY;

End;

Type pCChar^TCirChar;

{описание класса символа, перемещающегося по окружности}

TCirChar=object(TChar) хс,ус,г .‘integer; tO.real;

constructor Init(ach:char;axc, aye, ar: integer;atO:real); procedure Rel(t:integer); virtual;

End;

Constructor TCirChar.Init;

Begin

inherited Init(ach,axc+round(ar*sin(atO)),ayc+ round(ar* cos(atO))); xc:-axc; yc: =ayc; r:=ar; tO:=atO;

End;

Procedure TCirChar.Rel;

Begin

x: =xc+Round(r*sin(t0+t*0.05)); y: =yc+Round(r*cos(t0+t*0.05));

End;

Type TString=object

mas:array[1..10] of pChar; {массив указателей на объекты} n:integer; {реальное количество объектов}

procedure Init(as:string; tmove:byte); {создание объектов} procedure Move(t:integer); {перемещение строк}

procedure Done; {уничтожение объектов}

End;

Procedure TString.Init;

Var i:integer;

Begin

n:=length(as);

for i:=l to п do begin

case tmove of

l:mas[i]:=new(pLChar,Init(as[i], 9*i, GetMaxYdiv 2)); 2:mas[iJ:=new(pVChar,Init(as[iJ, GetMaxXdiv 2-n*5+10*i, 0)); 3:mas[i]:=new(pCChar,Init(as[i], GetMaxX div 2, GetMaxY div 2,

100, 2*pi*(i-l)/n));

end;

end;

End;

Procedure TString.Move;

Var ¡.‘integer;

Begin

for i:=n downto 1 do mas[iJA.Move(t);

End;

Procedure TString.Done;

Var i: integer;

Begin

for i:=l to n do dispose(mas[i],Done);

End;

Var s:string; M:array[1..3] of TString; i, t, dr, md:integer;

Begin

Write (‘Введите строку до 10 символов: ’);

ReadLn(s);

InitGraphfdr, md, ’d: Xbp \bgi ’); for i:=l to 3 do M[i].Init(s,i); t:=0;

while not KeyPressed and (t

<< | >>
Источник: Иванова Г.С. Основы программирования. 2002

Еще по теме Практикум. Создание контейнеров:

  1. Психологический практикум (к части II)
  2. Психологический практикум (к части I)
  3. Психологический практикум (к части IV)
  4. Психологический практикум (к части III)
  5. А.К. Быков. психолого­ педагогический практикум, 2006
  6. Могилев А. В.. Практикум по информатике, 2005
  7. Ю. И. КУДИНОВ, Ф.Ф. ПАЩЕНКО, А. Ю. КЕЛИНА. ПРАКТИКУМ ПО ОСНОВАМ СОВРЕМЕННОЙ ИНФОРМАТИКИ, 2011
  8. ПРАКТИКУМ: ТРЕНИНГ ПРОФЕССИОНАЛЬНО- ЛИЧНОСТНОГО САМООПРЕДЕЛЕНИЯ И САМОСОВЕРШЕНСТВОВАНИЯ УЧИТЕЛЯ
  9. Практикум
  10. Лавровская О. Б.. Технические средства информатизации. Практикум, 2013
  11. Кудинов Ю. И., Пащенко Ф. Ф., Келина А. Ю.. Практикум по основам современной информатики: Учебное пособие., 2011
  12. ПРАВОВОЙ ПРАКТИКУМ