26.02.2014 Aufrufe

Linux-Magazin Clean Linux (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!