ObjectiveCeeds › Cocoa Designpattern: Class Cluster

Cocoa Designpattern: Class Cluster

Von Manfred Kreß
OCNumber
Seite 2 von 3



Ich möchte Ihnen nun zeigen, wie ein Cluster implementiert wird. Wie NSNumber soll auch mein Cluster einen numerischen Wert speichern, OCNumber. Der Einfachheit halber, beschränke ich mich auf int und float Typen. ObjectiveCeeds: Class Cluster Zunächst gibt es die Klasse OCNumber, die als Interface dient. Des weiteren existieren zwei Klassen, OCNumberInteger und OCNumberFloat. Diese sind Subklassen von OCNumber. OCNumber stellt folgendes Interface zur Verfügung: OCNumber.h
@interface OCNumber : NSObject {

}

- (id) initWithInt: (int)value;
- (id) initWithFloat: (float)value;

- (int) intValue;
- (float) floatValue;

@end
Nichts spektakuläres. Aber beachten Sie: OCNumber speichert selbst keine Werte! Die Interfaces der beiden konkreten Subklassen sehen dann wie folgt aus: OCNumberInteger.h
#import "OCNumber.h"
 
@interface OCNumberInteger : OCNumber {

	int _OCInteger;
}

@end
OCNumberFloat.h
#import "OCNumber.h"

@interface OCNumberFloat : OCNumber {

	float _OCFloat;
}

@end
Wie Sie sehen, speichern diese Klassen nun tatsächlich Werte des jeweiligen Typs als Instanzvariablen. Ansonsten übernehmen sie die Methoden von OCNumber. Aber es gibt noch eine vierte Klasse, OCNumberPlaceholder: OCNumberPlaceholder.h
#import "OCNumber.h"

@interface OCNumberPlaceholder : OCNumber {
}
@end
OCNumberPlaceholder.m
#import "OCNumberPlaceholder.h"


@implementation OCNumberPlaceholder

@end
OCNumberPlaceholder ist identisch mit OCNumber. Auch die Implementation wird komplett übernommen. Sie werden gleich sehen, wozu diese Klasse dient. Cluster Klassen machen sich die "Two stage Initialisierung" von Cocoa zu nutze. D.h. es gibt eine Methode um Speicher für ein Objekt zu reservieren +(id)alloc und eine für die eigentliche Initialisierung. Tatsächlich ruft alloc dann intern allocWithZone: auf. Und diese wird dann überschrieben um jewils Speicher für die entsprechend benötigte Subklasse zu reservieren. Erzeugt man ein neues Clusterobjekt, so reserviert alloc zunächst immer Speicher für ein ein Platzhalterobjekt. Erst wenn dann die Methode initWithXY eine konkrete Klasse initialisiert, wird ein "richtiges" Objekt zurückgegeben und der Platzhalter wieder frei gegeben.

« vorige Seitenächste Seite »