Кликни и щелкни братьями-толкателями
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
не объявлены в этом устройстве. Поэтому мы добавляем ссылку на то, где они живут, на 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.
Теперь существует круговая ссылка между Cartalk
и Cartalk_Click
.
Примечание: Конечно, у меня нет подразделения Cartalk, с Click и Clack братьями тапперами - это всего лишь пример. В действительности у меня есть 3 класса, 20 перечислений и 293 константы в моем блоке.