Delphi Enterprise: como posso aplicar o padrão de visitantes sem referências circulares?

Com o Delphi 2009 Enterprise, criei o código para o GoF Visitor Pattern na visualização de modelo e separei o código em duas unidades: uma para as classes de modelo de domínio e outra para o visitante (porque talvez eu precise de outras unidades para diferentes implementações de visitantes, tudo em uma unidade? 'Grande bola de lama'à frente!).

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.

e a segunda unidade para as classes de modelo de negócios

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.

Vê o problema? Uma referência de unidade circular. Existe uma solução elegante? Eu acho que ele requer "n + 1" unidades adicionais com definições de interface / classe base para evitar o problema de CR e truques como hard castts?

questionAnswers(4)

yourAnswerToTheQuestion