Guten morgen,
ich versuche gerade meinen ersten Delphi Visitor zu schreiben und bin natürlich auf die wohl bekannten zirkulären Probleme gestoßen. Ich habe mit der Suche einige Themen gefunden, wo darüber gesprochen wird, eine Lösung aber nur erwähnt wird.
Da ich ein recht umfangreiches Composite habe, möchte ich auf keinen Fall alles in eine Datei packen. Ich wär daher daran interessiert ob es überhaupt eine Lösung dazu gibt und wie diese aussieht.
Delphi-Quellcode:
unit Base;
interface
type
Visitor =
class;
Base =
class
public
procedure Accept(v : Visitor);
virtual;
abstract;
end;
A =
class(Base)
public
procedure Accept(v : Visitor);
override;
end;
B =
class(Base)
public
procedure Accept(v : Visitor);
override;
end;
Visitor =
class
public
procedure Visit(a : A);
overload;
procedure Visit(b : B);
overload;
end;
implementation
{ Visitor }
procedure Visitor.Visit(a: A);
begin
WriteLn('
A');
end;
procedure Visitor.Visit(b: B);
begin
WriteLn('
B');
end;
{ B }
procedure B.Accept(v: Visitor);
begin
v.Visit(Self);
end;
{ A }
procedure A.Accept(v: Visitor);
begin
v.Visit(Self);
end;
end.
Delphi-Quellcode:
var
list : TList<Base>;
v : Visitor;
x : Base;
begin
list := TList<Base>.Create;
v := Visitor.Create;
list.Add(A.Create);
list.Add(B.Create);
for x in list do
x.Accept(v);
list.Free;
v.Free;
ReadLn;
end.
A soll nun in UnitA, B in UnitB und Visitor in UnitVisitor.
Wie löst ihr sowas? Setzt ihr vielleicht auch irgendwelche sinnvollen Alternativen zu Visitor ein? Ich seh bei mir irgendwie nur die Möglichkeit alles in A und B zu implementieren und sie zu Gottklassen mutieren zu lassen.
GRüße
hansmaad