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
|
type
IChildObject=interface
procedure SayHello;
end;
TInterfacedObject=class(TObject)
private
fCount:integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
TAggregatedObject=class(TObject)
private
fController:IInterface;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
constructor Create(AController:IInterface);
end;
TChildObject1=class(TInterfacedObject,IChildObject)
public
procedure SayHello;
end;
TParentObject1=class(TInterfacedObject,IChildObject)
private
fChild:IChildObject;
public
constructor Create;
property Child:IChildObject read fChild implements IChildObject;
end;
TChildObject2=class(TAggregatedObject,IChildObject)
public
procedure SayHello;
end;
TParentObject2=class(TInterfacedObject,IInterface,IChildObject)
private
fChild:IChildObject;
public
constructor Create;
property Child:IChildObject read fChild implements IChildObject;
end;
function TInterfacedObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
WriteLn(ClassName,'.QueryInterface');
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TInterfacedObject._AddRef: Integer;
begin
inc(fCount);
Result:=fCount;
WriteLn(ClassName,'._AddRef=',Result);
end;
function TInterfacedObject._Release: Integer;
begin
dec(fCount);
Result:=fCount;
WriteLn(ClassName,'._Release=',Result);
if fCount=0 then Free;
end;
constructor TAggregatedObject.Create(AController:IInterface);
begin
fController:=AController;
end;
function TAggregatedObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
Write(ClassName,'.QueryInterface->');
Result:=fController.QueryInterface(IID,Obj);
end;
function TAggregatedObject._AddRef: Integer;
begin
WriteLn(ClassName,'._AddRef->');
// Result:=fController._AddRef;
end;
function TAggregatedObject._Release: Integer;
begin
Write(ClassName,'._Release->');
Result:=fController._Release;
end;
procedure TChildObject1.SayHello;
begin
ShowMessage('Hello');
end;
constructor TParentObject1.Create;
begin
fChild:=TChildObject1.Create;
end;
procedure TChildObject2.SayHello;
begin
ShowMessage('Hello');
end;
constructor TParentObject2.Create;
begin
fChild:=TChildObject2.Create(Self);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i:IChildObject;
begin
AllocConsole;
Writeln('Mode 1');
i:=TParentObject1.Create;
i.SayHello;
i:=nil;
Writeln('Mode 2');
i:=TParentObject2.Create;
i.SayHello;
i:=nil;
end; |
Partager