Logo

Objective-C, Xcode und Cocoa Tutorial


 

 

EIN TUTORIAL ZU OBJECTIVE-C, XCODE UND COCOA

 

Kapitel 10 - Fortsetzung

Unten sehen Sie wie das NSCopying Protokoll in der Standard header Datei NSObject.h definiert ist:

@protocoll NSCopying
- (id)copyWithZone: (NSZone *)zone;
@end;

Wenn Sie jetzt das NSCopying Protokoll in Ihrer Klasse adoptieren wollen, müssen Sie eine Methode mit dem Namen copyWithZone: implementieren. Sie teilen dem compiler mit den <> Zeichen innerhalb der @interface Zeile mit, dass Sie ein Protokoll anwenden. Der Protokoll Name kommt dann nach dem Nemaen der Klasse und der Elternklasse.

@interface AdressBook: NSObject <NSCopying>

Das besagt, dass AdressBook ein Objekt der Elternklasse Object ist, welches übereinstimmt mit dem NSCopying Protokoll. Das geht nur deshalb, weil dass System über die zuvor definierten Methoden im Protokoll bescheid weiss. Weil es sich um ein protocoll handelt, müssen Sie jetzt im Interface Abschnitt die Methoden nicht mehr deklarieren, jedoch definieren im Implementation Abschnitt, weshalb der Compiler im Implementierungsabschnitt eine Definition der copyWithZone: Methode erwartet. Auch mehrere Protokolle können hinzugefügt werden, wenn Sie das wollen:

@interface AdressBook: NSObject <NSCopying, NSCoding>

 



Die zu NSObject hinzugefügten Protokolle werden auch auf die Subklassen vererbt. Mit einem Protokoll können Sie auch Methoden definieren, wenn Sie wollen, dass all jene die von Ihrer Klasse eine Subklasse erzeugen wollen, dann diese Liste von Methoden implementieren. Nehmen wir an Sie wollen eine GraphicObject Klasse erstellen und Sie wollen dabei die Methoden paint und erase definieren, so z.B.:

@protocol Drawing
- (void) paint;
-(void)erase;
@end;

Sie als Schöpfer der GraphicObject Klasse wollen diese Methoden nicht unbedingt implementieren, aber Sie wollen dass jemand der dann eine Subklasse erstellt, sich an diesen Standard von Methoden hält und er dann diese Methoden implementieren soll. So, wenn Sie eine Subklasse von GraphicObjekt erzeugen, z.B. ein Rechteck Objekt welches ein Drawing Protokoll mit übernommen hat, dann weiss der Benutzer der Rechteck Klasse, dass man paint und erase Nachrichten an verschiedene Instanzen der Klasse schicken kann - sofern diese vorher implementiert wurden. Bedenke, dass das Protokoll nicht zu einer bestimmten Klasse referenziert, es ist quasi klassenlos. Jede Klasse kann das Drawing Protokoll übernehmen wenn Sie wollen. Sie können überprüfen, ob ein Objekt ein zu (mit) einem Protokoll conform mit der conformTo: Methode. Wenn Sie beispielsweise ein Objekt mit dem Namen currentObject haben, und wissen wollen ob es mit dem Drawing Protokoll conformed, können Sie folgende Nachricht senden:

id currentObject;
...
if ([currentObject conformsTo: @protocoll (Drawing) = = YES)
{
// send currentObject paint und erase messages..
}

Die spezielle @protocol Direktive die hier benutzt wurde, nimmt ein Protokoll Name und produziert ein Protocol Object - das ist was die conformsTo: Methode erwartet als Argument.  Sie können die Hilfe des Compilers anwerben, in dem um Übereinstimmung mit Ihren Variablen zu überprüfen, wenn Sie den Protokoll Namen in <> Zeichen setzen, so z.B.:

id <Drawing> currentObject;

Damit teilen Sie dem Compiler mit, dass currentObject Objekte beinhaltet, die mit dem Drawing Protokoll übereinstimmen. Wenn sie jetzt eine statische Variable currentObject zuweisen, welche nicht zum Drawing Protokoll gehört - beispielsweise Sie haben eine Quadrat Klasse die nicht übereinstimmt - dann produziert der Compiler eine Warnung.

 

Composite Objects - gemischte Objekte

Jetzt haben Sie eine Menge Möglichkeiten erfahren, die Definitionen einer Klasse zu erweitern, sei es durch erstellen einer Subklasse, kategorisieren oder posing. Eine andere Technik ermöglicht eine Klasse zu definieren, die aus einer oder mehrerer Objekte von anderen Klassen besteht. Ein Objekt dieser Klasse wird als  gemischtes (composite) Objekt bezeichnet, weil es aus anderen Objekten gemischt wird. Wenn Sie eine Subklasse definieren, werden alle Instanz Variablen und Methoden von der Elternklasse vererbt. In manchen Fällen ist das lästig - z.B. manche der Methoden, die in der Elternklasse definiert wurden, sind für die Subklasse nicht angebracht oder angemessen. Wenn z.B. die setzteLaenge:undBreite: Methode von der Rechteck Klasse auf die Quadrat Klasse vererben, dann gibt das nicht viel Sinn, da ja Länge und Breite bei einem Quadrat gleich sind - ungeachtet der Tatsache, dass diese Methode natürlich auch bei der Quadrat Klasse perfekt funktionieren würde. Zudem müssen Sie beachten, dass wenn Sie eine Subklasse erzeugen, müssen Sie sich versichern, dass alle vererbten Methoden gut funktionieren, weil alle Benutzer der Klasse Zugriff darauf haben. Eine Alternative zum erzeugen von Subklassen, können Sie eine neue Klasse definieren, die als eines ihrer Instanzvariablen ein Objekt Ihrer Klasse enthält, die Sie erweitern wollen.


weiter ---- Objective-C Index ---- Startseite----zurück


Das Inhaltsverzeichnis

EINSTIEG
KAPITEL 1: SCHRITT FÜR SCHRITT ZUM ERSTEN PROGRAMM
KAPITEL 2: OBJEKTE, KLASSEN, INSTANZEN UND METHODEN
KAPITEL 3: DIE VERSCHIEDENEN DATENTYPEN
KAPITEL 4: DIE PROGRAMMSCHLEIFEN
KAPITEL 5: ENTSCHEIDE DICH, ENTWEDER ODER....
KAPITEL 6: UND NOCHMALS KLASSEN
KAPITEL 7: VERERBUNG
KAPITEL 8: POLYMORPHISMUS, DYNASCHISCHE TYPISIERUNG UND DYNAMISCHES BINDEN
KAPITEL 9: NOCH MEHR DATENTYPEN UND VARIABLEN
KAPITEL 10: CATEGORIES, POSING AND PROTOCOL
KAPITEL 11: DER PRÄPROZESSOR

 

 

 

Links