Flutter -- ohne Dart geht es nicht Klassen Teil 2
Im ersten Teil dieser kleinen Serie sind wir schon auf ein, zwei Punkte eingegangen, was Dart und Klassen betrifft.
Wenn wir uns den Code oben ansehen, bemerken wir eine einfache Klasse mit zwei Feldern / Variablen. Weiter im Code eine Funktion mit dem gleichen Namen wie die Klasse, die zwei Variablen als Übergabewerte erwartet. Diese tragen die gleichen Bezeichnungen, wie die Variablen im Klassenkopf. Die Funktion mit dem gleichen Namen wie die Klasse, ist der eigentliche Konstruktor. An sich eine Funktion, wird im OOP Sprachgebrauch der Begriff Konstruktor verwendet, was die Aufgabe dieser Funktion klarer macht. Wenn wir also mit
Im Code oben sehen wir wie beabsichtigt den Konstruktor mit dem gleichen Namen wie die Klasse.
Im Körper der main Funktion wird ein neues Objekt der Klasse generiert. Dabei werden dem Konstruktor zwei Zeichenketten übergeben. In Visual Studio Code wird die IDE zwei Probleme melden und uns darauf hinweisen, das die Variablen peter und maria nicht verwendet werden.
Wenn wir den Code ausführen, wird in die Konsole zweimal null gedruckt, also "nichts". Die Variablen peter und maria werden im Konstruktor nicht weiter verwendet, sind also nutzlos.
Im ersten Moment hilft das nicht weiter, der Code
wird uns wiederum null in die Konsole schreiben. Der Grund dafür ist einfach der, das sich der Konstruktor, eigentlich eine Funktion, auch so verhält. Das heißt bei der Generierung des Objekts wird der String übernommen, aber lokal verwendet. Die Variable zeichenKette1 im Konstruktor ist etwas anderes, als die Variable gleichen Namens im Klassenkopf. Diese Problematik hat mit dem Gültigkeitsbereich von Variablen zu tun. Das ist aber ein Thema, über das ich ein einem anderen Post schreiben werde.
Damit der Konstruktor seine Arbeit verrichten kann, gibt es für die Problematik eine Lösung. Mit dem Schlüsselwort this sagen wir dem Compiler, das wir uns explizit auf die Variablen beziehen, die wir zu Beginn unseres Bauplans definiert haben. Das sieht dann so aus:
Der Einsatz von this, gefolgt von der Variablenbezeichnung, initialisiert nun korrekt die zwei Variablen, die wir zu Beginn definiert haben. Führen wir den Code nun aus, werden Hans und Regina in die Konsole gedruckt. Mit this plus Variablenbezeichnung, zum Beispiel "this.zahl", beziehen wir uns also immer auf eine Variable, die in der Klasse schon definiert wurde.Initialisieren wir eine Variable nicht über den Konstruktor, können wir das später nachholen. Solange sie nicht initialisiert ist, ist ihr Inhalt null. Dabei ist null ein Dart Sprachobjekt und nicht mit 0 aus dem Zahlenraum zu verwechseln.
Der Konstruktor selbst ist nun auf eine Zeile reduziert. Durch den Einsatz von this, weiss der Compiler, das die übernommen Zeichenketten, den entsprechenden Klassenvariablen aus dem Kopf zu zuweisen sind.
mehr zu einem Konstruktor
Beim erstellen einer Klasse, dem "Bauplan" für ein Objekt in unserem Code, können wir einen Konstruktor implementieren. Vom Begriff Konstruktor, ist es nicht weit zu "konstruieren" und genau darum geht es. Wenn wir aus unserem Bauplan ein reales Objekt im Code machen, ist es zu Beginn nicht mehr, als ein Platz im Speicher. Mit dem Bauplan definieren wir aber auch Variablen / Felder des Objekts, wie zum Beispiel eine Zeichenkette: String zeichenKette1;
Wir können diese Variablen schon im Bauplan mit einem Wert versehen, aber auch später, wenn wir das reale Objekt im Code generiert haben.
Beispiel eins
var neuesObjekt = lernenEins(....);
ein neues Objekt unseres Bauplans erstellen, wird dieser Konstruktor aufgerufen. Innerhalb dieses Konstruktor können wir die Initialisierungen vornehmen, die wir möchten.
Was passiert aber, wenn wir keinen Konstruktor im Bauplan definieren ?
In diesem Fall generiert Dart einen für uns, der ohne Folgen bleibt und dementsprechend auch nichts initialisiert. Das gleiche Prinzip werden wir später auch im Zusammenhang mit Getters und Setters sehen.
Beispiel zwei und warum es nicht funktioniert
Im Körper der main Funktion wird ein neues Objekt der Klasse generiert. Dabei werden dem Konstruktor zwei Zeichenketten übergeben. In Visual Studio Code wird die IDE zwei Probleme melden und uns darauf hinweisen, das die Variablen peter und maria nicht verwendet werden.
Wenn wir den Code ausführen, wird in die Konsole zweimal null gedruckt, also "nichts". Die Variablen peter und maria werden im Konstruktor nicht weiter verwendet, sind also nutzlos.
Was wenn wir im Konstruktor die gleichen Variablen verwenden, wie im Klassenkopf ?
Im ersten Moment hilft das nicht weiter, der Code
wird uns wiederum null in die Konsole schreiben. Der Grund dafür ist einfach der, das sich der Konstruktor, eigentlich eine Funktion, auch so verhält. Das heißt bei der Generierung des Objekts wird der String übernommen, aber lokal verwendet. Die Variable zeichenKette1 im Konstruktor ist etwas anderes, als die Variable gleichen Namens im Klassenkopf. Diese Problematik hat mit dem Gültigkeitsbereich von Variablen zu tun. Das ist aber ein Thema, über das ich ein einem anderen Post schreiben werde.
Beispiel drei und das Schlüsselwort this
Damit der Konstruktor seine Arbeit verrichten kann, gibt es für die Problematik eine Lösung. Mit dem Schlüsselwort this sagen wir dem Compiler, das wir uns explizit auf die Variablen beziehen, die wir zu Beginn unseres Bauplans definiert haben. Das sieht dann so aus:
und das ganze mit weniger Code
Ein Vorteil von Dart im Vergleich mit anderen Sprachen ist, das es für einige, wiederkehrende Codekonstrukte auch kurze Versionen gibt. Beim Konstruktor sieht das so aus:
Kommentare
Kommentar veröffentlichen