Open Source im professionellen Einsatz

Strichfassung

Eine einzelne Funktionsdefinition wie beispielsweise

int quadrat(int zahl) { return zahl*zahl; }

darf der Dart-Anwender mit »=>« abkürzen:

int quadrat(int zahl) => zahl*zahl;

»=> e« steht dabei für »{ return e; }« . In Dart darf man zudem eine Funktion an eine andere übergeben, was besonders in »for« -Schleifen nützlich ist.

Die Funktion »sagHallo()« in Listing 3 setzt den ihr übergebenen String hinter »Hallo« und gibt das Ergebnis auf dem Bildschirm aus. Anschließend erstellt die zweite Zeile eine Liste mit drei Namen, die »forEach« nacheinander in die ihr übergebene Funktion schiebt – in diesem Fall also »sagHallo()« . Der Dreizeiler gibt folglich »Hallo Tim« , »Hallo Klaus« und »Hallo Hans« aus. Da »sagHallo()« nur in »namen.forEach()« auftaucht, kann man die Funktion auch direkt dort deklarieren und dabei gleich noch auf ihren Namen verzichten, wie Listing 4 zeigt.

Listing 4

Funktion übergeben (II)

01 List namen = ["Tim", "Klaus", "Hans"];
02 namen.forEach( (String name) => print("Hallo ${name}") );

Listing 3

Funktion übergeben (I)

01 sagHallo(String name) => print("Hallo ${name}");
02 List namen = ["Tim", "Klaus", "Hans"];
03 namen.forEach(sagHallo);

Das ist zwar sehr kompakt, bei komplexeren Funktionen geht allerdings schnell die Übersicht flöten. Zur Steuerung des Kontrollflusses stehen ansonsten die üblichen Verdächtigen »for« , »if« , »switch« und »while« bereit, die genau wie ihre Pendants in Java beziehungsweise Javascript funktionieren. Zudem lassen sich wie in Java über Exceptions elegant Fehler abfangen.

Klassisches

Von Java hat Dart auch die Interfaces geerbt. Implementiert eine Klasse ein Interface, sichert sie zu, die im Interface vorgegeben Funktionen anzubieten. Ein Beispiel samt Vererbung zeigt Listing 5. Eine Klasse kann mehrere Interfaces implementieren, aber immer nur von genau einer Klasse erben (sie also via »extends« erweitern).

Listing 5

interfaces und extend

01 interface Flaeche {
02         int flaechenInhalt();
03 }
04
05 class Quadrat implements Flaeche {
06         int breite;
07         Quadrat(int this.breite);
08         int flaechenInhalt() => breite*breite;
09 }
10
11 class Rechteck extends Quadrat {
12         int _hoehe;
13         Rechteck(int this._hoehe, int br) : super(br);
14         int flaechenInhalt() => breite * _hoehe;
15 }
16
17 main() {
18         Quadrat q = new Quadrat(3);
19         Rechteck r = new Rechteck(2,3);
20         print(q.flaechenInhalt());
21         print(r.flaechenInhalt());
22 }

In Listing 5 sind alle Variablen und Funktionen öffentlich zugänglich – mit einer Ausnahme: »_hoehe« . Beginnt der Name einer Variablen oder einer Funktion mit einem Unterstrich, gilt sie als privat. Nur aus der Klasse selbst kann der Programmierer dann noch darauf zugreifen. Im Beispiel führt das dazu, dass sich die Höhe eines Rechtecks nachträglich nicht mehr verändern lässt.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook