Delphi:如何将类移出单元;避免循环引用

Delphi:如何将类移出单元;避免循环引用,delphi,refactoring,circular-dependency,delphi-5,circular-reference,Delphi,Refactoring,Circular Dependency,Delphi 5,Circular Reference,问题:我想将两个类拆分为各自的文件,同时避免循环引用 我有一个包含一些类(以及一些枚举和常量)的单元。任何人都会认识到: 显然,我的两个类TClick和TClick非常复杂。为了便于管理,我希望将TClick和TClack拆分为各自的单元,同时不破坏任何现有的外部代码 我的第一个想法是: unit Cartalk; interface uses Cartalk_Click, Cartalk_Clack; type TSolution = (solTransmission, so

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

我有一个包含一些类(以及一些枚举和常量)的单元。任何人都会认识到:

显然,我的两个类
TClick
TClick
非常复杂。为了便于管理,我希望将
TClick
TClack
拆分为各自的单元,同时不破坏任何现有的外部代码

我的第一个想法是:

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.
很好,我在
Cartalk.pas
中提供了所有相同的类,现在我只需编写
Cartalk\u Click.pas
Cartalk\u 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.
当然,问题是
TTappetBrother
t解决方案
并没有在本单元中声明。因此,我们在
使用的
中添加了对他们居住地点的引用,看着它失败,并触及我问题的核心:

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.
现在,
Cartalk
Cartalk\u点击
之间有一个循环引用

注意:当然我没有Cartalk装置,有Click and Clack the tapper brothers-这只是一个例子。实际上,我的单位中有3个类、20个枚举和293个常量。

写一个单位:

unit Tappet;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

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

implementation

end.

并在
点击
点击
单元中使用它。然后编写
CarTalk
单元来使用这三种类型,并在其接口中导出所需的类型。不需要循环引用。

挺杆(如“轻敲”)兄弟。只需说“编辑:修复了一个挺杆的打字错误。在少数项目的每个单元中添加一个单元使用
子句太难了?@Andreas Rejbrand:是的。如果你不能接受我的问题:一名恐怖分子劫持了我妻子为人质,如果我不能在不破坏现有密码的情况下将
TClick
TClack
拆分成一个单独的单元,我想这就是解决办法。“导出所需的类型”,我假设您的意思是like
TClick=class(Click.TClick)?或多或少。您不需要
关键字。这只是问题中的别名。@Ian Boyd:就像VCL一样。例如,
TPoint
是在
Types.pas
中定义的(在
uses
子句中很少看到),但在
Windows.pas
中(几乎总是在本子句中),可以“导出”它:
type TPoint=Types.TPoint
(是的,
const
在这方面与
type
类似。)
unit Tappet;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

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

implementation

end.