Delphi Enterprise: Wie kann ich das Besuchermuster ohne Zirkelverweise anwenden?
Mit Delphi 2009 Enterprise habe ich in der Modellansicht Code für das GoF - Besuchermuster erstellt und den Code in zwei Einheiten aufgeteilt: eine für die Domänenmodellklassen und eine für den Besucher (da ich möglicherweise andere Einheiten für verschiedene Besucherimplementierungen benötige, alles in eine Einheit? 'Große Schlammkugel'voraus!).
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.
und die zweite Einheit für die Geschäftsmodellklassen
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.
Sehen Sie das Problem? Eine kreisförmige Einheitsreferenz. Gibt es eine elegante Lösung? Ich vermute, es erfordert "n + 1" zusätzliche Einheiten mit Basisschnittstellen- / Basisklassendefinitionen, um das CR-Problem zu vermeiden, und Tricks wie harte Würfe?