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?