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
拆分成一个单独的单元,我想这就是解决办法。“导出所需的类型”,我假设您的意思是likeTClick=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.