Keine Ahnung ob dir das hilft:
Delphi-Quellcode:
unit Base;
type
TVisistor =
class;
TBase =
class
public
procedure Accept(v : TVisitor);
virtual;
abstract;
end;
TVisitor =
class
public
procedure Visit(ABase: TBase);
virtual;
abstract;
end;
Delphi-Quellcode:
unit ClassA;
uses
Base;
type
TA =
class(TBase)
public
procedure Accept(v : TVisitor);
override;
end;
Delphi-Quellcode:
unit ClassB;
uses
Base;
type
TB =
class(TBase)
public
procedure Accept(v : TVisitor);
override;
end;
Delphi-Quellcode:
unit VisitorAB;
uses
Base, ClassA, ClassB;
type
TVisitorAB
private
procedure VisitA(A: TA);
procedure VisitB(B: TB);
public
procedure Visit(ABase: TBase);
override;
end;
implementation
procedure TVisitorAB.Visit(ABase: TBase);
begin
if ABase
is TA
then
VisitA(TA(ABase));
if ABase
is TB
then
VisitB(TB(ABase));
end;
Statt die Funktionen für die konkreten Klassen im Visitor zu implementieren, könnte man diese auch in spezille Klassen auslagern, die beim Visitor mit der jeweils unterstützten Baseklasse registriert werden.