Вопрос: Я хочу разделить два класса на свой собственный файл, избегая при этом круговых ссылок.Delphi: как перемещать класс из единицы, избегать циркулярных ссылок
У меня есть единица с некоторыми классами (и некоторые перечисления и константы). Любой распознает 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
не объявлены в этом устройстве. Таким образом, мы добавим ссылку туда, где они живут на 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 константы в моей группе.
«Толкатель» (например, «постучите по нему») Братья. Just sayin ' –
** Редактировать **: Исправлена одна опечатка толкателя. –
Добавление единицы в предложение 'uses' в каждом блоке в нескольких проектах слишком сложно? –