visitor-pattern
-
Ich hab mich bisher noch nicht wirklich mit den ganzen Pattern auseinandergesetzt, denke aber das sollte ich langsam mal tun.
Jedenfalls hab ich grad mal was über's visitor-pattern gelesen. IRgendwie sieht das für mich so aus, dass man einen aufruf, den ich so machen würde:
Klasse foo; bar(foo);
jetzt so mache:
Klasse foo; foo.accept(bar);
Wo liegt der Vorteil? Wa habe ich falsch verstnaden?
-
Helium schrieb:
Jedenfalls hab ich grad mal was über's visitor-pattern gelesen. IRgendwie sieht das für mich so aus, dass man einen aufruf, den ich so machen würde:
Klasse foo; bar(foo);
jetzt so mache:
Klasse foo; foo.accept(bar);
Wo liegt der Vorteil? Wa habe ich falsch verstnaden?
Visitor wird in *Hierarchien* verwendet. Wenn du nur Objekte einer Klasse hast und damit den genauen Typ dieser Objekte kennst, dann ist Visitor natürlich sinnlos. Da geht dein erstes Beispiel wunderbar.
Hast du aber eine Hierarchien und behandelst du die Objekte dieser Hierarchien nur über Basisklassenreferenzen, dann geht dein Ansatz nicht mehr, da bar keine schöne Möglichkeit hat, den Typ von foo herauszubekommen.
Hier hilft das Visitor-Pattern. accept ist virtuell, beachtet also den *dynamischen* Typ von foo. In accept ist der genaue Typ des Objekts aber natürlich statisch bekannt und kann für die Auflösung von bar::visit verwendet werden.
Es ist also kein switch-on-type nötig.
-
Danke. Jetzt macht's Sinn.