echo $begrüßung;
Für C++ und Java kann ich nicht sprechen. Ich schweife mal kurz zu Python ab.
Um einen Iterator in Python zu implementieren ist es ausreichend, wenn ein Objekt eine next()-Methode hat[*][**]. Das reicht schon aus, um iterieren zu können und entspricht dem konkreten Iterator. Interfaces gibt es unter Python nicht. Ein Iterator-Lieferant in Form eines konkreten Aggregats kann mit der Methode __iter__() implementiert werden.
Ein Iterator allein läuft einfach nur durch eine Datenmenge. Normalerweise hat er keinen Mechanismus, um für eine weitere Iteration zurückgesetzt zu werden oder andere initiale Handlungen mit der Datenmenge anzustellen. Das muss der Aggregator machen, der quasi eine Art Konstruktor für einen Iterator darstellt.
was ich noch nicht genaz verstehe, wo der konkret Iterator implementiert wird. Wenn ich nun ein konkretes Aggregat erstelle, muss ich dann 2 Klassen programmieren?
Ein Interface, sofern es benötigt wird, muss nach den Gegebenheiten der jeweiligen Programmiersprache erstellt werden. In den meisten Fällen wird das wohl ein separates Gebilde sein. Das Interface ist ja nur eine nebensächliche Formsache. Im Folgenden meine ich immer nur eine konkrete Implementation.
Der Iterator kann für einfache[***] Fälle bereits in der Datenverwaltungs- bzw. -beschaffungsklasse implementiert werden, über die dann auch iteriert wird. Wenn du ein Aggregat benötigst, ist es günstig, dieses in der zu iterierenden Datenmenge zu implementieren und den Iterator in eine eigene Klasse zu tun, weil du dir für jede Iteration einzeln merken musst, wo der Aktuelles-Element-Zeiger grad ist oder vielleicht um eine Kopie der Daten(teil)menge zu speichern. Für jede Iteration erzeugt das Aggregat dann eine eigens erstellte Instanz des Iterators. Es ist aber auch möglich, Aggregat und Iterator in die Datenklasse zu packen. Die Aggregat-Methode nimmt beim Start einer Iteration die Initialisierung vor und gibt dann das Objekt für das sie aufgerufen wurde (this, self) zurück, weil dieses ja auch eine Iterator-Implementation ist. Du hast dann nur das Problem, dass nur ein Objekt existiert, das alle (vielleicht gleichzeitig laufenden) Iterationen so verwalten muss, dass sich diese nicht ins Gehege kommen.
- das Aggregat selbst
- den zugehörigen Iterator
oder? Da in C++ Iteratoren Pointer sind kann man in C++ diese als innere Klassen implementieren. In Java müssten diese als separate Dateien, also als separate Klassen implementiert werden. Ist das so richtig?
Da ich C++ und Java nicht bedienen kann muss ich dir eine konkrete Antwort schuldig bleiben. Außer Python kenne ich nur Iterator und IteratorAggregate von PHPs SPL. Dasjenige Objekt, das in der foreach-Schleife als das zu iterierende angegeben werden soll, muss entweder mittels IteratorAggregate-Implementation eine Iterator-Implementation zurückliefern oder selbst eine Iterator-Implementation enthalten.
[*] Zumindest etwas, das sich wie eine Methode anfühlt. Man kann ja auch eine Objektinstanz callable machen.
[**] Diese Methode wird beim Iterieren solange aufgerufen, bis sie eine StopIteration-Exception wirft. Sie ist also Weiter(), IstFertig() und AktuellesElement() in Personalunion.
[***] auch im Sinne von nur einmal zu durchlaufen zu verstehen.
echo "$verabschiedung $name";