Практикум. Создание контейнеров
В функции контейнеров обычно входит создание объектов разных классов, их последовательная обработка и уничтожение.
В процессе создания объектов под них отводят память и выполняют инициализацию полей.
Для выполнения последовательной обработки обычно классы объектов строят таким образом, чтобы они включали методы с одинаковыми именами (полиморфные), возможно выполняющие различные действия для объектов различных классов.
Однако при последовательной обработке возможна и проверка типа (класса) конкретного объекта (см. параграф 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
Еще по теме Практикум. Создание контейнеров:
- Психологический практикум (к части II)
- Психологический практикум (к части I)
- Психологический практикум (к части IV)
- Психологический практикум (к части III)
- А.К. Быков. психолого педагогический практикум, 2006
- Могилев А. В.. Практикум по информатике, 2005
- Ю. И. КУДИНОВ, Ф.Ф. ПАЩЕНКО, А. Ю. КЕЛИНА. ПРАКТИКУМ ПО ОСНОВАМ СОВРЕМЕННОЙ ИНФОРМАТИКИ, 2011
- ПРАКТИКУМ: ТРЕНИНГ ПРОФЕССИОНАЛЬНО- ЛИЧНОСТНОГО САМООПРЕДЕЛЕНИЯ И САМОСОВЕРШЕНСТВОВАНИЯ УЧИТЕЛЯ
- Практикум
- Лавровская О. Б.. Технические средства информатизации. Практикум, 2013
- Кудинов Ю. И., Пащенко Ф. Ф., Келина А. Ю.. Практикум по основам современной информатики: Учебное пособие., 2011
- ПРАВОВОЙ ПРАКТИКУМ