Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать

3.1.5. Сравнимость данных типа объект

В Turbo Pascal допускается присвоение переменных типа объект друг другу. При этом должны соблюдаться следующие требования.

Если две переменные соответствуют одному типу объекта, то присвоения допускаются в обоих направлениях. При этом присвоении передаётся значения всех переменных.

Если объект С – предшественник и D – наследник и C1 и D1 – переменные типа объект C и объект D, то допускается присвоение C1:=D1. Обратное присвоение недопустимо, потому что объект – наследник содержит больше полей данных, чем объект – предшественник, такое присвоение влечет за собой неопределённость части полей данных.

3.1.6. Динамический вызов объектов

Аналогично другим переменным, переменные типа объект могут динамически создаваться и уничтожаться. Для обеспечения динамического вызова в программе должен быть указатель на объект, а сам объект должен содержать конструктор (даже тогда, когда он не содержит виртуальных методов) и деструктор. Конструктор необходим для формирования VMT, в котором задана длина объекта. Через VMT при динамическом создании экземпляра объекта можно узнать его длину для определения необходимого объёма памяти. Деструктор тоже обеспечивает доступ к VMT для определения объёма освобождаемой памяти. Деструктор может не иметь в своем составе операторов; тогда он обеспечивает только связь с VMT. В общем случае в деструктор желательно включить действия, необходимые перед уничтожением экземпляра объекта. Деструктор может быть виртуальным, конструктор – нет. Для создания экземпляра объекта используется оператор New:

New(S1,Init); где

S1 – указатель на объект,

Init – конструктор объекта.

Приведенная ниже запись эквивалентна предыдущей:

New(S1); S1^.Init;

Для уничтожения экземпляра объекта используется оператор Dispose:

Dispose(S1,Done); где

S1 – указатель,

Done – деструктор.

или S1^.Done; Dispose(S1);

Проиллюстрируем сказанное на примере. Описание объектов Location и Ch приведено в п. 3.3.2.

{Объект Location и Ch см. выше, вариант Virt}

type

BufferType=Array[1..1000] of Byte;

St = Object(Ch)

S:String;

F:Text;

FileOpen:Boolean;

Buffer:^BufferType;

Constructor Init;

Destructor Done;Virtual;

Procedure Show;Virual;

Procedure SetS(NewS:String);

Procedure OpenFile(Fname:String):

End;

Constructor ST.Init;

Begin

Ch.Init; S:=’’;

FileOpen:=False;

New(Buffer); {Выделение памяти для переменных}

{экземпляра объекта}

End;

Destructor St.Done;

Begin

Dispose(Buffer); {Освобождение памяти, занятой при выполнении}

{конструктора}

if FileOpen Then Close(F);

end;

Procedure St.Show;

Begin

Write(S);

End;

Procedure St.SetS(NewS:String);

Begin

S:=NewS; Writeln(F,NewS);

End;

Procedure St.OpenFile(Fname:String);

Begin

Assign(F,Fname);

Rewrite(F);

FileOpen:=True;

End;

Var S1,S2:^St; {указатели на St}

Begin

ClrScr;

New(S1.Init); {Cоздание экземпляров объектов}

New(S2.Init); {Запускается два раза конструктор}

With S1^ Do {Выполнение операций над экземпляром объекта}

Begin {на который указывает S1}

OpenFile(‘ST1.LOG’);

SetS(‘THIS IS STRING 1’);

MoveTo(10,10);

End;

With S2^ Do

Begin

OpenFile(‘ST2.LOG’);

SetS(‘THIS IS STRING 2’);

MoveTo(10,11);

End;

Dispose(S1,Done); {Уничтожение объектов, запуск деструктора} Dispose(S2,Done);

End.

В результате выполнения этой программы будут созданы два текстовых файла ST1.LOG и ST2.LOG и на экране появятся 2 строки текста.