Sie können das gleiche Idiom verwenden, das in Cocoa-Klassen verwendet wird. Wenn Sie sich die NSString-Klassen-Schnittstelle in NSString.h ansehen, werden Sie feststellen, dass keine Instanzvariable deklariert ist. Wenn Sie tiefer in den GNUstep-Quellcode eintauchen, werden Sie den Trick finden.
Betrachten Sie den folgenden Code.
MyClass.h
@interface MyClass : NSObject
// Ihre Methoden hier
- (void) doSomething;
@end
MyClass.m
@interface MyClassImpl : MyClass {
// Ihre privaten und versteckten Instanzvariablen hier
}
@end
@implementation MyClass
+ (id) allocWithZone:(NSZone *)zone
{
return NSAllocateObject([MyClassImpl class], 0, zone);
}
// Ihre Methoden hier
- (void) doSomething {
// Diese Methode gilt als rein virtuell und kann nicht aufgerufen werden
[self doesNotRecognizeSelector: _cmd];
}
@end
@implementation MyClassImpl
// Ihre Methoden hier
- (void) doSomething {
// Eine tatsächliche Implementierung von doSomething
}
@end
Wie Sie sehen können, besteht der Trick darin, allocWithZone: in Ihrer Klasse zu überladen. Dieser Code wird standardmäßig von alloc bereitgestellt von NSObject aufgerufen, sodass Sie sich keine Gedanken darüber machen müssen, welche Zuweisungsmethode verwendet werden sollte (beide sind gültig). In einem solchen allocWithZone: können Sie die Foundation-Funktion NSAllocateObject() verwenden, um Speicher zu zuweisen und isa für ein MyClassImpl-Objekt anstelle von MyClass zu initialisieren. Danach handelt es sich für den Benutzer transparent um ein MyClassImpl-Objekt.
Natürlich muss die tatsächliche Implementierung Ihrer Klasse von MyClassImpl bereitgestellt werden. Die Methoden für MyClass müssen so implementiert werden, dass das Empfangen einer Nachricht als Fehler betrachtet wird.