Wieso 2 verschiedene Methoden, wo sie doch genau das Selbe machen?
Sie machen doch nicht das selbe?! Die eine schreibt 'A', die andere schreibt 'B'.
Das ist doch der Sinn des Vistor Patterns. Für jedes ConcreteElement gibt es unterschiedliches Verhalten, dass aber nicht in der Element Klasse, sondern in einem (konkreten) Visitor implementiert ist.
Meine jetzige Alternativlösung ist folgende:
Delphi-Quellcode:
unit UBase;
uses UWriter;
type
Base =
class
public
function MakeWriter(): Writer;
virtual;
abstract;
end;
Delphi-Quellcode:
unit UWriter;
interface
type
Writer =
class
public
procedure Write();
virtual;
abstract;
end;
Delphi-Quellcode:
unit UA;
interface
uses
UBase,UWriter;
type
A =
class(Base)
public
function MakeWriter() : Writer ;
override;
end;
implementation
uses
UAWriter;
{ AA }
function A.MakeWriter: Writer;
begin
Result := AWriter.Create(Self);
end;
Delphi-Quellcode:
unit UAWriter;
interface
uses
UWriter,
UA;
type
AWriter =
class(Writer)
public
constructor Create(x : A);
overload;
procedure Write();
override;
end;
implementation
{ AWriter }
procedure AWriter.
Write;
begin
WriteLn('
A');
end;
end.
Das hat gegenüber Visitor den Nachteil, dass ich bei neuer Funktionalität in jeder Elementklasse(A, B...) eine neue Schnittstelle hinzufügen muss, statt nur einen neuen Visitor abzuleiten. Der Nutzen hängt natürlich immer vom Verhältnis Elemente:Vistors ab und was sich wie häufig ändert. Wenn häufig Elemente hinzukommen, kann Visitor auch recht lästig sein.
Mir scheint Visitor in Delphi allerdings sehr aufwändig, wenn nicht unmöglich zu implementieren zu sein.
Zum konkreten Fall:
Base, A, B .. sind Elemente eines Composite (Teile einer Anlage). Stellt euch das WriteLn('A') als Schreiben eines seitenlangen Berichts vor. Von solchen Sachen gibt es ein paar...Dinge, die man möglichst von A, B usw. trennen möchte.