Flutter -- ohne Dart geht es nicht Klassen Teil 1

Wie dem interessierten Leser sicherlich schon bekannt sein dürfte, ist Dart eine objektorientierte Programmiersprache, kurz OOP.
Zu OOP gehören Objekte und Klassen. Wie vieles im Leben ist der Start in das Thema einfach, kann und wird aber mit zunehmender Tiefe anspruchsvoller.

Klassen


Eine Klasse, oder auch Objekttyp, kann man als Bauplan verstehen, um eine reale Problemstellung in einem Softwareobjekt abzubilden. Wir könnten zum Beispiel die Klasse Schach definieren, um anschließend die einzelnen Figuren aus dieser Klasse zu generieren.

Eine Klasse besitzt Attribute und Methoden/Funktionen. Wenn wir jetzt das Beispiel Schach umsetzen möchten, können wir uns an dem realen Schach orientieren. In der Theorie ist das immer die richtige Vorgehensweise, das heißt: ein Objekt / Problemstellung aus der realen Welt, wird analysiert und in eine Klasse umgewandelt.


  • class Schach
  • Farbe
  • Form
  • erlaubteBewegungen
Mit der Klasse Schach könnten wir jetzt ein Objekt erzeugen, das einen weißen Bauern darstellt.
Dazu generieren wir aus der Klasse ein Objekt und geben ihm einen Namen: weisserBauer.

weisserBauer = neu Schach (weiß, bauer, einoderzwei)

Dies ist natürlich nur eine Abstrakte Schreibweise, die das Prinzip aber erklärt. Mit der Klasse Schach erzeugen wir ein Objekt weisserBauer. Bei der Erzeugung geben wir ihm die notwendigen Attribute mit. Mit der gleichen Klasse Schach könnten wir auch ein Objekt für den König oder für den Läufer erstellen, von beiden Spielfarben.

Alles ist Familie


Sehen wir uns jetzt einmal eine ganz einfache Klasse in Dart an:


class GanzEinfach{ // Schlüsselwort class gefolgt von dem Namen der Klasse
var nurEineZahl; // der Typ der Variablen ist hier "var" und der Name der
} // Name der Variablen ist nurEineZahl.
view raw klasse1.dart hosted with ❤ by GitHub
Diese Klasse ist wirklich gaaanz einfach oder ? Ein Programm besteht meistens aus verschiedenen Klassen, die eine Anzahl von Objekten schaffen, welche wiederum in einer Beziehung zu einander stehen. Im ersten Moment liest sich das kompliziert, wird aber mit einem weiteren Beispiel deutlicher:

class GanzEinfach{ // Schlüsselwort class gefolgt von dem Namen der Klasse
var nurEineZahl; // der Typ der Variablen ist hier "var" und der Name der
} // Name der Variablen ist nurEineZahl.
class IchHabeEltern extends GanzEinfach{ // die neue Klasse IchhabeEltern erweitert
// die Klasse ganz Einfach
var nurEineZweiteZahl; // und definiert eine Variable
}
view raw klasse2.dart hosted with ❤ by GitHub

Mit dem Schlüsselwort extends erweitern wir unsere gaaaanz einfache Klasse. Die Erweiterung definiert dabei eine neue Variable.

Aus der Sicht von GanzEinfach ist IchHabeEltern ein Kind. Aus Sicht von IchHabeEltern ist GanzEinfach die Eltern. In OOP kehren die Begriffe Eltern und Kinder immer wieder. Sie sind immer aus dem Kontext heraus zu verstehen. D.h. das Objekt / Klasse die ich gerade bearbeite kann Eltern oder Kinder haben.
Zurück aber zu unserem Beispiel. In Dart hat jede Klasse einen Konstruktor. Entweder geben wir ihn explizit an, oder falls nicht, generiert Dart einen.

Konstruktor ? Sind wir jetzt in der Baubranche ?


Wenn wir die Klasse GanzEinfach anschauen, ist klar, das der ganze Aufwand um nur eine Variable zu deklarieren, wohl total übertrieben ist. Der Konstruktor gibt unserer Klasse  mehr Funktionalität. Bei der Erzeugung eines Objekts können wir Informationen mitgeben, die in das neue Objekt eingebunden werden. Ein Konstruktor ist Teil der Klasse, hat den gleichen Namen wie die Klasse und kann als Funktion betrachtet werden. Im Unterschied zu einer gewöhnlichen Funktion, gibt der Konstruktor aber keine Werte zurück. Er hat also kein Return Statement. Hier ein Beispiel:


class GanzEinfach{ // Schlüsselwort class gefolgt von dem Namen der Klasse
var nurEineZahl; // der Typ der Variablen ist hier "var" und der Name der
} // Name der Variablen ist nurEineZahl.
class IchHabeEltern extends GanzEinfach{ // die neue Klasse IchhabeEltern erweitert
// die Klasse ganz Einfach
var nurEineZweiteZahl; // und definiert eine Variable
IchHabeEltern(String nurEineZweiteZahl){ // der Konstruktor hat den gleichen Namen wie die Klasse
this.nurEineZweiteZahl = nurEineZweiteZahl; // mit this. kann Dart zwischen gleichlautenden Variablen Namen
} // unterscheiden
}
void main() {
var test = new IchHabeEltern("Hallo"); // dem Konstruktor wird der String "Hallo" übergeben
print(test.nurEineZweiteZahl); // die Variable im erzeugten Objekt Test wird in die Konsole
// gedruckt
}
view raw klassen3.dart hosted with ❤ by GitHub
Im übrigen wird im Beispiel von Zahl gesprochen, aber es werden Strings benutzt. Das ist ein gutes Beispiel dafür, wie wichtig gute und passende Variablen Namen sind.
Im nächsten Teil geht es weiter mit Klassen....demnächst!

Kommentare

Beliebte Posts aus diesem Blog

Dart Basic: Parameter in Funktionen

Dart und Klassen

Flutter -- Tutorial Teil 7 Form Part 1 TextFormField