Delphi: Как вывести класс из блока, избегать циклических ссылок - PullRequest
3 голосов
/ 22 октября 2010

Вопрос: Я хочу разделить два класса на их собственный файл, избегая циклических ссылок.

У меня есть блок с некоторыми классами (и некоторыми перечислениями и константами). Кто-нибудь узнает Кликни и щелкни братьями-толкателями

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 константы в моем блоке.

1 Ответ

5 голосов
/ 22 октября 2010

Введите единицу измерения:

unit Tappet;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

implementation

end.

и используйте его в единицах Click и Clack. Затем напишите модуль CarTalk, чтобы использовать все три, и экспортируйте необходимые типы в его интерфейс. Циркулярные ссылки не нужны.

...