1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
program tmoperator5;
{$MODE DELPHI}
type
TR1 = record
private
class operator Initialize(var aR1: TR1);
class operator Finalize(var aR1: TR1);
public
I: Integer;
end;
TR2 = record
private
class operator Initialize(var aR2: TR2);
class operator Finalize(var aR2: TR2);
public
S: string;
end;
{ TR1 }
class operator TR1.Initialize(var aR1: TR1);
begin
WriteLn('TR1.Initialize');
aR1.I := 1;
end;
class operator TR1.Finalize(var aR1: TR1);
begin
if aR1.I <> 2 then
Halt(1);
aR1.I := 3;
WriteLn('TR1.Finalize');
end;
{ TR2 }
class operator TR2.Initialize(var aR2: TR2);
begin
WriteLn('TR2.Initialize');
aR2.S := 'A';
end;
class operator TR2.Finalize(var aR2: TR2);
begin
if aR2.S <> 'B' then
Halt(2);
WriteLn('TR2.Finalize');
end;
{ TA }
type
TA = object
public
F1: TR1;
end;
TB = object(TA)
public
F2: TR2;
end;
procedure Foo();
var
LO: TB;
begin
if LO.F1.I <> 1 then
Halt(4);
if LO.F2.S <> 'A' then
Halt(5);
LO.F1.I := 2;
LO.F2.S := 'B';
end;
var
O: TB;
P: ^TB;
begin
WriteLn('=== Global object variable [begin] ===');
if O.F1.I <> 1 then
Halt(3);
if O.F2.S <> 'A' then
Halt(4);
WriteLn;
WriteLn('=== Local variable ===');
Foo();
WriteLn;
WriteLn('=== New and Dispose ===');
New(P);
if P^.F1.I <> 1 then
Halt(10);
if P^.F2.S <> 'A' then
Halt(11);
P^.F1.I := 2;
P^.F2.S := 'B';
Dispose(P);
WriteLn;
WriteLn('=== InitializeArray and FinalizeArray ===');
GetMem(P, SizeOf(TB));
InitializeArray(P, TypeInfo(TB), 1);
if P^.F1.I <> 1 then
Halt(12);
if P^.F2.S <> 'A' then
Halt(13);
P^.F1.I := 2;
P^.F2.S := 'B';
FinalizeArray(P, TypeInfo(TB), 1);
if P^.F1.I <> 3 then
Halt(14);
FreeMem(P);
WriteLn;
WriteLn('=== Initialize and Finalize ===');
GetMem(P, SizeOf(TB));
Initialize(P^);
if P^.F1.I <> 1 then
Halt(15);
if P^.F2.S <> 'A' then
Halt(16);
P^.F1.I := 2;
P^.F2.S := 'B';
Finalize(P^);
if P^.F1.I <> 3 then
Halt(17);
FreeMem(P);
WriteLn;
WriteLn('=== Global variable [end] ===');
O.F1.I := 2;
O.F2.S := 'B';
end.
|