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, и трюки, подобные жестким броскам?