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相当复杂.对于管理,我想分裂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.
Run Code Online (Sandbox Code Playgroud)
完美,我有所有相同的课程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.
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个常量.
写一个单位:
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)
并Click在Clack单位中使用它.然后编写CarTalk单元以使用全部三个并在其界面中导出所需的类型.不需要循环引用.