Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Programmieren<br />
www.linux-magazin.de Vala 09/2013<br />
94<br />
sprechen von einem Lambda-Ausdruck.<br />
In Vala haben anonyme Methoden sogar<br />
Zugriff auf die Variablen in ihrer direkten<br />
Umgebung, was einer Closure oder einem<br />
Funktionsabschluss entspricht:<br />
int c = 3;<br />
RechneTyp d = (x) => {return x+c;};<br />
int e = d(5); // e ist hier 8<br />
Methodenaufrufe darf der Vala-Programmierer<br />
an beliebig viele Bedingungen<br />
knüpfen (Contract Programming). Die<br />
Bedingungen für die Eingabewerte definiert<br />
»requires«, »ensures« legt jene für<br />
die Rückgabewerte fest, wobei »result«<br />
für den Rückgabewert steht:<br />
int addiere(int x, int y)<br />
requires(x > 0 && y < 10)<br />
ensures(result > 0)<br />
{<br />
return x+y;<br />
}<br />
Listing 4 erstellt eine neue Klasse namens<br />
»Auto«, die von der Gobject-Basisklasse<br />
»GLib.Object« erbt. »Auto« besitzt<br />
ein privates Attribut »farbe«, das sich mit<br />
der öffentliche Methode »lackieren()« ändern<br />
lässt. »this« bezeichnet das aktuelle<br />
Objekt, wie in anderen Sprachen auch.<br />
01 public class Auto : GLib.Object {<br />
02 private string farbe;<br />
03 <br />
04 // Konstruktor:<br />
05 public Auto(string f) {<br />
06 base();<br />
07 this.farbe = f;<br />
08 }<br />
09 <br />
10 // Methode:<br />
11 public void lackieren(string f) {<br />
12 this.farbe = f;<br />
13 }<br />
14 <br />
15 // Destruktor:<br />
16 ~Auto() {print("verschrottet");}<br />
17 }<br />
01 class Auto {<br />
Listing 4: Klassendefinition<br />
02 private string farbe = "rot";<br />
03 <br />
04 public string aussehen {<br />
05 get { return farbe; }<br />
06 set { farbe = value; }<br />
07 }<br />
08 }<br />
Listing 5: Properties<br />
09 <br />
Neben »public« und<br />
»private« kennt Vala<br />
zwei weitere Zugriffsmodifizierer:<br />
Während<br />
bei »private« der Zugriff<br />
nur der Klasse<br />
selbst gestattet ist,<br />
dürfen bei »protected«<br />
auch alle abgeleiteten<br />
Klassen auf das Attribut<br />
oder die Methode<br />
zugreifen. »internal«<br />
wiederum gestattet<br />
allen Klassen den Zugriff,<br />
die sich in derselben<br />
Quellcode-Datei<br />
befinden.<br />
Um eine Klasse außerhalb<br />
der aktuellen<br />
Quellcode-Datei nutzen<br />
zu können, muss der Programmierer<br />
sie wie in Listing 4 als »public« kennzeichnen.<br />
Standardmäßig sind Klassen<br />
nur »internal«. Ein neues »Auto« erstellt<br />
die folgende Zeile:<br />
Auto bmw = new Auto("blau");<br />
Dabei ruft Vala den Konstruktor auf, der<br />
den gleichen Namen trägt wie die Klasse.<br />
Den Konstruktor der Oberklasse aktiviert<br />
»base()«. Erlaubt ist auch ein Destruktor,<br />
den Vala aufruft, bevor es das Objekt<br />
zerstört. Destruktoren tragen den Namen<br />
der Klasse mit vorangestellter Tilde<br />
»~«. Sie sind besonders dann nützlich,<br />
wenn man selbst die Speicherverwaltung<br />
übernimmt, C-Bibliotheken nutzt oder<br />
die Klasse Ressourcen verwalten lässt.<br />
Genau wie bei Java darf auch in Vala die<br />
»main()«-Funktion Teil einer Klasse sein<br />
(Abbildung 4).<br />
Eigenschaften<br />
Private Attribute manipuliert der Entwickler<br />
in der Regel über passende<br />
»get()«- und »set()«-Methoden. Die damit<br />
10 int main() {<br />
11 <br />
12 Auto ferrari = new Auto();<br />
13 ferrari.aussehen = "blau";<br />
14 print(ferrari.aussehen);<br />
15 <br />
16 return 0;}<br />
Abbildung 3: Über den »+=«-Operator lassen sich an Strings weitere Zeichen<br />
anhängen (wie hier der Zeilenumbruch).<br />
einhergehende Tipparbeit reduzieren so<br />
genannte Properties. Listing 5 erstellt<br />
eine Property mit dem Namen »aussehen«,<br />
sie lässt sich wie ein öffentliches<br />
Attribut nutzen. Zeile 13 legt in ihr etwa<br />
den String »blau« ab. Vala ruft dabei im<br />
Hintergrund automatisch die »set()«-Methode<br />
der Property auf, die im Beispiel<br />
den Wert im privaten Attribut »farbe«<br />
speichert. »value« ist ein Schlüsselwort<br />
und steht für den übergebenen Wert. Wer<br />
in »get()« und »set()« nur Werte setzt<br />
beziehungsweise liest, kann sich die Variable<br />
»farbe« sogar sparen:<br />
public string aussehen { get; set;U<br />
default = "rot";}<br />
Sofern eine Klasse von »GLib.Object« erbt,<br />
darf man sie auch wie in Listing 6 definieren.<br />
Den abschließenden »construct«-<br />
Block führt Vala immer aus, wenn sie ein<br />
Objekt der Klasse erzeugt. Im Konstruktor<br />
weist »Object(farbe: f);« dem Attribut<br />
»farbe« den Wert aus dem übergebenen<br />
Parameter »f« zu. Mehrere Zuweisungen<br />
trennt ein Komma: »Object(farbe: f, geschwindigkeit:<br />
kmh);«. Diese Notation<br />
funktioniert jedoch nur, wenn »f« und<br />
»kmh« Properties sind.<br />
Wink mit dem Zaunpfahl<br />
»GLib.Object« bringt zudem Signalbehandlung<br />
ins Spiel: Löst ein Objekt ein<br />
Signal aus, ruft Vala automatisch alle<br />
Methoden auf, die sich für das Signal<br />
interessieren. C#-Programmierer kennen