previous next Up Title Contents

Anhang 1: Die Basics der Programmiersprache Objective-C

Objective-C ist aus einer Phase der Kritik heraus entstanden, in der erkannt wurde, daß die von der Sprache C angebotenen Softwarekonzepte für die Entwicklung komplexer Softwaresysteme unzureichend ist.

Bei der Entwicklung von Objective-C standen zwei wichtige Kriterien im Vordergrund:

* Wiederverwendbarkeit: Benutzung von vorhandenem Code und Integration.

* Leichte Erlernbarkeit der Sprachkonstrukte.

Bei der Suche nach einem passenden Konzept stieß man auf das Konzept der Objektorientierung.

Mit diesem Hintergrund entschied man sich die Hybridsprache Objective-C zu entwickeln. Sie ist ein einfacher aufwärtskompatibler, objektorientierter Aufsatz auf C. Durch diese einfache Erweiterung ist Objective-C sogar aufwärtskompatible zu C++ und ermöglicht ein beliebiges Mischen dieser Sprachkonstrukte.

Bei der Entwicklung von Objektive-C wurden einige Konstrukte der Sprache Smaltalk-80 entnommen, aber trotzdem blieb die resultierende Sprache klein und einfach zu erlernen. Die Struktur der Programme ist überschaubar und lesbar.

1. Übersetzer und Klassenbibliotheken

Objective-C ist ein Aufsatz auf C, aus diesem Grund entschied man sich dafür die ersten Übersetzer als PreÜbersetzer zu entwickeln, der als Zwischenergebnis reinen C/C++-Quelltext erzeugt, der dann wiederum von einem "normalen" Compiler übersetzt wird. Die PreÜbersetzer sind mittlerweiler in den C/C++-Überresetzern integriert und es tritt nur ein geringfügiger Geschwindigkeitsverlust ein.

Eine Objective-C-Datei wird durch die Endung ".m" erkannt , C-Dateien enden mit ".c".

Folgende Objetive-C-Übersetzer sind verfügbar:

* Stepstone Objektive-C; entwickelt von Brad J. Cox.

* GNU gcc/objc; Implementierung der Free Software Foundation und ist mit dem gcc auf fast allen Plattformen verfügbar.

* NeXTStep/Openstep; Eine der größten objektorientierten Entwicklungsumgebungen, die auf dem gleichnamigen objektorientierten Betriebssystem, das komplett in Objective-C implementiert ist, Windows-NT, HP-UX und auf SUN betrieben werden kann.

Aus dem letztgenannten Grund ergab sich eine größere Verbreitung dieser Sprache und die Schaffung einiger bedeutender Klassenbibliotheken, wie WebObjects, Enterprise Objects Framwork, Distributed Objekts und einige anderer.

2. Polymorphismus und dynamisches Binden

Objektive-C ist sowohl dynamisch als auch statisch typisiert, wobei der statische Teil auf den ANSI-C Anteil und der dynamische auf die bei der Entwicklung geschaffenen, objektorientierten Erweiterungen beruht.

Objektiv-C unterstützt Polymorphismus, Overriding, Overloding von Methoden und dynamisches Binden, wobei Objektive-C einen Schritt weiter geht und darüber hinaus geht und eine Auswahl von Nachrichten zur Laufzeit erlaubt.

3. Objekte

Objektive-C vereint eine Datenstruktur (instance variables) und eine Menge von Methoden zu einer Einheit, die die objektorientierten Grundprinzipien erfüllt.

Für nicht typisierte Objekte wurde der Datentyp "id" geschaffen, der eine Adresse enthält, die den Anfang des Objekts beschreibt. Ein Nullobjekt wird mit dem Schlüsselwort "nil" definiert.

Der Typ "id" ist absolut uneingeschränkt. Jedes Objekt enthält eine Instanzvariable namens "isa", aus der zur Laufzeit der Objekttyp ausgelesen werden kann.

Objective-C ist somit dynamisch getypt und bietet die Möglichkeit zur Feststellung der exakten Klassenzugehörigkeit.

Beispiele:

Id objekt = ni;

// Schafft ein neues Objekt vom Typ "Liste", auf das über den Zeiger "liste" zugegriffen

// werden kann.

Liste *liste = [ Liste new];

// Die Adresse der Variablen "liste" wird der Variablen "objekt" zugewiesen.

objekt = liste;

4. Nachrichten und Methoden

Um ein Objekt zu einer Aktion zu initiieren, sendet man ihm eine Nachricht, was nichts anderes bedeutet, als das Objekt zu veranlassen eine Methode auszuführen.

Nachrichten werden in Objective-C durch eckige Klammern gekennzeichnet. Sie bestehen aus drei Teilen:

* Dem Empfänger (receiver)

* Dem Selektor (selector) oder auch Methodenname

* Den Argumenten, wenn notwendig.

Beispiel:

id Empfaenger = [Object new];

[Empfänger nachricht];

Der Empfänger (receiver) ist ein Objekt vom Typ id und die Nachricht veranlaßt ihn eine Methode auszuführen..

Beipiel:

[meinRechteck diplay];

Die Methode display des Objekts meinRechteck erfordert keine Übergabe von Objekten.

[meinRechteck setOrigin:30 :50];

Die Methode setOrigin erfordert die beiden Argumente 30 und 50, die die Position des Objekts meinRechteck auf dem Bildschirm angeben. Die Methode wird gefolgt von zwei Doppelpunkten; einer für jedes Argument. Die Argumente werden hinter dem jeweiligen Doppelpunkt aufgeführt.

[meinRechteck setWidth: 10 height:15 ];

Vor jedem Doppelpunkt kann auch eine Beschreibung durch ein Schlüsselwort des jeweiligen Arguments stehen. Es ist aber keine Vorschrift. Wenn dies allerdings vereinbart wurde, dann müssen die Schlüsselwörter auch benutzt werden.

Des weiteren ist eine variable Anzahl von Argumenten möglich, was eine Trennung der aufeinanderfolgenden Argumente durch Komma voraussetzt. Im folgenden Beispiel hat das Objekt eine Methode makeGroup, die ein Argument group verlangt, und die weiteren durch Komma getrennten Argumente optional akzeptiert.

[Empfaenger makeGroup: group, memberOne, memberTwo, memberThree];

Rückgabewert:

Genauso wie C-Funktionen haben auch Objectiv-C-Methoden die Möglichkeit eines Rückgabewertes.

Beipiel:

BOOL gefuellt; // BOOL ist ein vordefinierter Standard-Typ der Werte YES

// und NO annehmen kenn

Gefuellt = [meinRechteck gefuellt];

In diesem Beispiel ist zu erkennen, daß Methoden und Variablen den gleichen Namen haben können.

Eine weitere Möglichkeit ist die Schachtelung von Methodenaufrufen:

[meinRechteck setzeFarbe: [anderesRechteck farbe] ];

5. Instanzvariablen

Auf Instanzvariable kann nur über Methoden des Objekts zugegriffen werden, was eine absolute Kapselung der objekteigenen Instanzen zur Folge hat.

Bild: Instanzkapselung

In der obigen Abbildung ist der Mechanismus der Kapselung deutlich erkennbar und lehnt sich an die Symbolik der NeXT-Entwickler an.

6. Implementierung von Objekten (Klassen und Protokolle)

Jedes Objecitve-C-Objekt ist eine Instanz einer Klasse. Die Klasse definiert die Instanzvariablen, die Methoden und die ererbten Klassen, die ihre Instanzvariablen und Methoden zur Verfügung stellen. Ein zusätzlicher Mechanismus der Protokolle, der eine Möglichkeit der Definition einer Schnittstelle zu einer Klasse bietet.

Jede Klasse besitzt eine Superklasse, oder auch Vaterklasse genannt. Der Ursprung aller Klassen ist die Klasse Objekt. Mehrfachvererbung ist in Objektive-C nicht erlaubt, somit wird jede neue Klasse in eine Baumstruktur eingefügt.

Die Implementierung einer Klasse setzt sich aus zwei Teilen zusammen, der Interfacedeklaration und der Klassenimlpementation. Das Interface befindet sich, zwar nicht zwingend, aber aus Übersichtlichkeitsgründen, in einem ".h"-File und der Implementationsteil in einem ".m"-File, der den ".h"-File importiert.

6.1 Die Interface-Deklaration

Das Interface beschreibt die Objective-C-Klasse und gibt die Klasse an, von der geerbt wird.

Beispiel:

@interface KlassenName : SuperKlassen

{

Deklaration der Instanzvariablen

}

Prototypen der Methoden

@end

Mit @interface wird die Beschreibung der Klasse eingeleitet. Darauf folgt der Klassenname, der gleich dem Dateinamen sein sollte, und mit einem Doppelpunkt getrennt die Superklasse von der die Klasse abgeleitet wurde. In dem nachfolgenden Block werden die Instanzvariablen beschrieben. Nach dem Block folgt die prototypische Beschreibung der Methoden. Ein @end kennzeichnet das Ende der Interfacebeschreibung.

6.2 Methoden

Die Methoden beginnen mit einem vorangestellten Plus zur Kennzeichnung einer Klassenmethode oder einem Minus, das eine Instanzmethode kennzeichnet. Der Datentyp des Rückgabewertes wird in Klammern vor den Methodenbezeichner gesetzt. Ist dies nicht der Fall, so ist der Default-Rückgabetype = id. Nach dem Rückgabewert wird die Methodenbezeichnung angegeben, hieran können sich Argumente anschließen, die durch Doppelpunkte getrennt sein müssen. Vor den Doppelpunkten kann eine Argumentbeschreibung stehen. Jedem Argument muß eine Typ-Angabe vorangestellt werden.

Beispiel für Methodendeklaration:

Klassenobjekt-Methode

+ alloc;

Instanzobjekt-Methoden

- (POINT)getPoint;

- (void)setPoint: (float*)x : (float*)y;

- (void)setXKoordinate: (float*)x undYKoordinate: (float*)y ;

6.4 Klassen-Implementierung

Im Implementierungs-File werden die im Interface deklarierten Methoden mit Inhalt versehen, um ihre Aufgabe auszuführen. Die Deklaration wird mittels #import "KlassenName.h" imporiert. Dieses Makro unterscheidet sich vom herkömmlichen include in sofern, als daß es doppeltes Importieren unterbindet.

Beispiel:

#import "KlassenName.h"

@implementation KlassenName

Methoden-Definition

@end

Die Einleitung erfolgt mit @implementation, hieran schließt sich der Klassennamen an und das Ende mit @end eingeleitet. Innerhalb dieser Marken wird die Definition der Methoden vorgenommen.

6.4 Methoden-Definition

Die Methoden-Definition erfolgt mit dem schon im Deklarationsteil beschriebenen Funktionskopf, gefolgt von einem Funktionskörper, der in geschweifte Klammern steht. Ein eventueller Rückgabewert wird mit der C-Anweisung return an die aufrufende Ebene zurückgegeben.

Beispiel:

- (POINT)getPoint

{

retrun point;

}

- (void)setPoint: (float*)x : (float*)y

{

pointX = x;

pointY = y;

}

6.5 Protokolle

Protokolle definieren eine Schnittstelle, über die mit dem instanzierten Objekt einer Klasse kommuniziert werden kann. Letztendlich ist ein Protokoll nur eine Liste von Methoden, die unabhängig von der Klassendefinition einem anderen Objekt zur Verfügung gestellt werden. Sie stellen die Sichtweise dar, in der sich ein Objekt einem anderen Objekt präsentiert, dies könnte man auch als Make-up bezeichnen.

Die folgende Situationen rechtfertigen den Einsatz von Protokollen:

* Um Methoden zu deklarieren, die von anderen implementiert werden sollen. Die Schnittstellendeklaration gibt an, auf welche Methoden ein Objekt antwortet. Oft wollen Objekte Aufgaben an andere delegieren, Informationen bekommen oder aber andere Objekte über Aktionen informieren.

* Um Schnittstellen für ein Objekt zu deklarieren, während man die Klasse verbergen will. Diese Objekte werden auch anonyme Objekte genannt.

* Um ähnliche Klassen unter Klassen, die nicht hierarchisch in Beziehung stehen, aufzugreifen.

Objective-C bietet die Möglichkeit, eine Gruppe von Methoden als Protokoll zu deklarieren.

Formelles Protokoll:

@protokoll ProtokollName

Methodendeklaration

@end

Im Interface wird das Protokoll dann wie folgt bekanntgegeben:

@interface KlassenName : SuperKlasse < Protokolliste>

7. Self und Super

Self in Objective-C ist das Gegenstück zu this in C++. Es bezieht sich auf die Instanz, in der eine Methode ausgeführt wird. Bei Nutzung von Self wird eine Methodensuche in der untersten Klassenebene eingeleitet.

Super beginnt in der obersten Klassenebene mit der Methodensuche und erlaubt somit ein Überschreiben von Methoden, ohne auf die alte Implementierung verzichten zu müssen.

Beispiel:

@implementation Klasse

- (void) addX

{

x = x+1;

}

- (void)methode01

{

[self addX]

}

@end

8. Object Lifetime

Ein Objekt wird geboren und benötigt natürlich nach seiner Geburt seinen Platz in der Welt. Dieser wird durch die Methode alloc geschaffen. Alloc ist eine Methode des Wurzel-Objektes Objekt, das auch als Vater aller Objekte bezeichnet werden kann, denn jedes Objekt hat in seinem Ursprung der Vererbungshierarchie die Klasse Objekt. Objekt kümmert sich mit alloc um die Allokation von Speicherplatz und mit init um die Initialisierung. Die Methode init kann dabei beliebig, unter der Bedingung des Einfügens einer [super init]-Message, überschrieben werden. Der gesamte Lebenszyklus wird mit Methoden der Objekt-Klasse behandelt.

Beispiel für die Schaffung eines Objekts:

// Schaffung eines Objekts

Id objekt = [[KlassenName alloc] init];

// Alternative die beide Methoden vereint;

Id objekt = [KlassenName new];

// Freigabe eines Objekts

[objekt release];


previous next Up Title Contents