Delphi Enterprise: как я могу применить Шаблон посетителя без циклических ссылок?

В Delphi 2009 Enterprise я создал код для шаблона посетителей GoF в представлении модели и разделил код на две единицы: одну для классов модели домена, одну для посетителя (поскольку мне могут понадобиться другие блоки для разных реализаций посетителя, все в один блок? 'Большой шарик грязи«Вперед!).

unit VisitorUnit;

interface

uses
  ConcreteElementUnit;

type
  IVisitor = interface;

  IElement = interface
  procedure Accept(AVisitor :IVisitor);
  end;

  IVisitor = interface
  procedure VisitTConcreteElement(AElement :TConcreteElement);
  end;

  TConcreteVisitor = class(TInterfacedObject, IVisitor)
  public
    procedure VisitTConcreteElement(AElement :TConcreteElement);
  end;

implementation

procedure TConcreteVisitor.VisitTConcreteElement(AElement :TConcreteElement);
begin
  { provide implementation here }
end;

end.

и второй блок для классов бизнес-модели

unit ConcreteElementUnit;

interface

uses
  VisitorUnit;

type
  TConcreteElement = class(TInterfacedObject, IElement)
  public
    procedure Accept(AVisitor :IVisitor); virtual;
  end;

  Class1 = class(TConcreteElement)
  public
    procedure Accept(AVisitor :IVisitor);
  end;

implementation

{ Class1 }

procedure Class1.Accept(AVisitor: IVisitor);
begin
  AVisitor.VisitTConcreteElement(Self);
end;

end.

Видишь проблему? Круговая единица ссылки. Есть ли элегантное решение? Я полагаю, что требуется «n + 1» дополнительных юнитов с определениями базового интерфейса / базового класса, чтобы избежать проблемы CR, и трюки, подобные жестким броскам?

Ответы на вопрос(4)

Ваш ответ на вопрос