两个带有两个循环引用的类

时间:2012-01-03 17:28:30

标签: delphi circular-dependency

我在两个不同的单元中有两个不同的类,我如何创建循环引用?在Delphi中(类别在不同的单元中)

第1单元:

Uses unit2;

type Ta = class(tobject)
   public
       b:Tb;
end;

第2单元:

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 helperssolving-circular-unit-references-with-class-helpers

的优秀摘要