德尔福:如何将一个类移出一个单元;避免循环引用

Ian*_*oyd 3 delphi refactoring circular-dependency delphi-5 circular-reference

问题:我想将两个类拆分为自己的文件,同时避免循环引用.

我有一个单元有一些类(和一些枚举和常量).任何人都会认出Click and Clack挺杆兄弟:

unit Cartalk;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

   TClack = class(TTapperBrother)
   public
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

function TClack.GetSoltution: TSolution;
begin
   Result := solGremlins;
end;

end.
Run Code Online (Sandbox Code Playgroud)

现在显然是我的两个班级TClick并且TClick相当复杂.对于管理,我想分裂TClickTClack出自己的单位而没有违反任何现有的外部代码.

我的第一个问题是:

unit Cartalk;

interface

uses
   Cartalk_Click, Cartalk_Clack;

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

   TClick = Cartalk_Click.TClick; //alias brought in from Cartalk_Click.pas

   TClack = Cartalk_Clack.TClack; //alias brought in from Cartalk_Clack.pas

 implementation

 end.
Run Code Online (Sandbox Code Playgroud)

完美,我有所有相同的课程Cartalk.pas,现在我只需要写Cartalk_Click.pasCartalk_Clack.pas:

unit Cartalk_Click;

interface

type
   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

end.
Run Code Online (Sandbox Code Playgroud)

当然,问题在于TTappetBrother并且TSolution未在此单元中声明.因此,我们添加一个参考他们居住的地方uses,观察它失败,并触及我的问题的核心:

unit Cartalk_Click;

interface

uses
   Cartalk;

type
   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

end.
Run Code Online (Sandbox Code Playgroud)

现在Cartalk和之间有一个循环引用Cartalk_Click.

注意:当然我没有Cartalk单元,Click和Clack是tapper兄弟 - 这只是一个例子.实际上,我的单​​元中有3个类,20个枚举和293个常量.

Muh*_*uri 5

写一个单位:

unit Tappet;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

implementation

end.
Run Code Online (Sandbox Code Playgroud)

ClickClack单位中使用它.然后编写CarTalk单元以使用全部三个并在其界面中导出所需的类型.不需要循环引用.