Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
19. Okt 2011
Darf ich mal kurz was in die Runde werfen?
Runtime <> Compiletime ;)
In TVisitableBase.Accept ist der formale Typ von Self: TVisitableBase, also wird die Überladung Visit(TVisitableBase) genommen.
In TVisitableDerived wird diese Methode jetzt nur vererbt, ohne dass sich der formale Typ von Self dort ändert, also ändert sich auch nicht, welche Überladung genommen wird.
Zur Laufzeit steckt...
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
19. Okt 2011
Nein, so geht's nicht. Hier würde ja jedes mal v.Visit(TVisitableBase) aufgerufen werden.
Das gibt's aber nicht. Es gibt lediglich Überladungen mit TClass1 und TClass2 und die muss ich auch entsprechend aufrufen ;)
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
18. Okt 2011
Grad mal überflogen, sehr ausführlich :thumb:
Und viel ansehnlichere Beispiele als ich.
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
18. Okt 2011
Natürlich reicht auch eine ;)
Kein Ding ;)
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
18. Okt 2011
Am sinnvollsten ist es natürlich, sie nach dem zu benennen, was sie machen soll ;)
"Visit" nennt man üblicherweise die Methoden des Visitors. Die Methode in der Klasse, die ich hier "TuWasBesonderes" genannt habe, heißt in der Literatur zumeist "Accept".
In der Praxis gibt man ihr aber lieber einen aussagekräftigeren Namen.
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
18. Okt 2011
Das kommt natürlich ganz auf die Situation an.
Manchen Code kann man natürlich besser bei der Klasse behalten, aber gar nicht so selten kommt es eben auch vor, dass es einfach übersichtlicher ist, wenn man bestimmte Codestellen auslagert.
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
18. Okt 2011
Soweit es so gewünscht ist, kann man den Wert ja auch der Methode einfach übergeben:
type
TKlasse = class;
IVisitor = interface
procedure Visit(const x: TKlasse; const v: Integer);
end;
TKlasse = class
protected
FWert: Integer;
Forum: Neuen Beitrag zur Code-Library hinzufügen
by implementation,
18. Okt 2011
Hallo liebe Forumsgenossen,
so manch einer von euch ist sicherlich schonmal in folgende Situation geraten:
Ihr habt sehr viele Klassen, die alle eine neue gemeinsame Methode bekommen sollen, die sich aber nicht zentral im Vorfahren einfügen lässt (bspw. weil sich jede Unterklasse anders verhalten soll).
Nun könntet ihr die Methode in jeder dieser Klasse einzeln einführen. Dann hättet ihr...