我在两个不同的单元中有两个不同的类,我如何创建循环引用?在Delphi中(类别在不同的单元中)
第1单元:
Uses unit2;
type Ta = class(tobject)
public
b:Tb;
end;
第2单元:
答案 0 :(得分:6)
我认为你的意思是我如何摆脱它们!
将它们放在一个文件中,根据你的结构,你可能也是一个答案。
type tb = class;
type Ta = class(TObject)
public
b:Tb;
end;
type Tb = class(TObject)
public
a:Ta;
end;
其他方式是情境化的,例如你可以抽出一个可以拥有Ta或Tb的类,或者一个类可以由Ta或Tb拥有......
但是我建议你看一下Interfaces ....
好的两个不同的文件
嗯,不,三个......
Unit3;
type tc = class(TObject)
public c:Tc;
end;
Unit1;
type Ta = class(TObject)
public
b:Tc;
end;
Unit2;
type Tb = class(TObject)
public
a:Tc;
end;
或者
Unit3;
type Ic = interface; end;
Unit1;
type Ta = class(TObject)
public
b:Ic;
end;
Unit2;
type Tb = class(TObject)
public
a:Ic;
end;
找到共同的位,在第三个单元中有另外两个基本上使用它。除了其他任何东西,它会给你一个更好的设计。
答案 1 :(得分:3)
使用class helpers
确实可以规避圆形单位参考。
通过为Ta和Tb添加一个包含类助手的公共UnitClassHelper,它可以像这样解决:
unit Unit1;
interface
type Ta = class(tobject)
public
b : TObject;
end;
implementation
uses UnitClassHelper;
-
unit Unit2;
interface
type Tb = class(tobject)
public
a : TObject;
end;
implementation
uses UnitClassHelper;
-
unit UnitClassHelper;
interface
uses Unit1,Unit2;
Type TaHelper = Class Helper for Ta
private
function GetTb : Tb;
procedure SetTb( obj : Tb);
public
property B : Tb read GetTb write SetTb;
End;
Type TbHelper = Class Helper for Tb
private
function GetTa : Ta;
procedure SetTa( obj : Ta);
public
property A : Ta read GetTa write SetTa;
End;
implementation
function TaHelper.GetTb: Tb;
begin
Result:= Self.B;
end;
procedure TaHelper.SetTb(obj: Tb);
begin
Self.B:= obj;
end;
function TbHelper.GetTa: Ta;
begin
Result:= Self.A;
end;
procedure TbHelper.SetTa(obj: Ta);
begin
Self.A:= obj;
end;
end.
-
program Test;
uses
Unit1 in 'Unit1.pas',
Unit2 in 'Unit2.pas',
UnitClassHelper in 'UnitClassHelper.pas';
var
AObj : Ta;
BObj : Tb;
begin
AObj:= Ta.Create;
BObj:= Tb.Create;
try
AObj.B:= BObj;
BObj.A:= AOBj;
// Do something
finally
AObj.Free;
BObj.Free;
end;
end.
另请参阅class helpers
:solving-circular-unit-references-with-class-helpers