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

标签 delphi refactoring circular-dependency delphi-5 circular-reference

Question: i want to split two classes out to their own file, while avoiding circular references.

我有一个包含一些类(以及一些枚举和常量)的单元。任何人都会认出Click and Clack the tappet brothers :

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.

现在显然我的两个类 TClickTClick 非常复杂。为了便于管理,我想将 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.

完美,我在 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.

问题当然是 TTappetBrotherTSolution 没有在此单元中声明。因此,我们在用途中添加对它们居住位置的引用,观察它的失败,并触及我问题的核心:

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.

现在 CartalkCartalk_Click 之间存在循环引用。

注意:当然,我没有 Cartalk 装置,还有 Click 和 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.

并在ClickClack 单元中使用它。然后编写 CarTalk 单元以使用所有这三个并在其接口(interface)中导出所需的类型。不需要循环引用。

关于Delphi:如何将类移出单元;避免循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991483/

相关文章:

javascript - jQuery 重构函数

unit-testing - 在单元测试中使用旧代码验证结果

delphi - 使用局部函数和全局函数哪个更优化?

delphi - 帮助在 Delphi 项目构建后事件中使用signtool.exe

delphi - 可以解析Delphi XMLDoc格式并建立在线帮助的工具

refactoring - 如何在soapUI中重命名服务

javascript - Backbone/RequireJS 嵌套列表中的循环依赖

python - 我能对 "ImportError: Cannot import name X"或 "AttributeError: ... (most likely due to a circular import)"做些什么?

flutter - 如何使百分比指示器在 flutter 中以编程方式改变颜色?

delphi - 连接时无法创建等待对话框