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.
现在显然我的两个类 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_Click.pas
和 Cartalk_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
和 TSolution
没有在此单元中声明。因此,我们在用途
中添加对它们居住位置的引用,观察它的失败,并触及我问题的核心:
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_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.
并在Click
和Clack
单元中使用它。然后编写 CarTalk
单元以使用所有这三个并在其接口(interface)中导出所需的类型。不需要循环引用。
关于Delphi:如何将类移出单元;避免循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991483/