Typischerweise sind Objective-C-Klassen nur per Konvention abstrakt - wenn der Autor eine Klasse als abstrakt dokumentiert, verwenden Sie sie einfach nicht, ohne sie zu subklassifizieren. Es gibt jedoch keine Kompilierzeit-Erzwingung, die die Instanziierung einer abstrakten Klasse verhindert. Tatsächlich gibt es nichts, was einen Benutzer daran hindert, Implementierungen abstrakter Methoden über eine Kategorie (d.h. zur Laufzeit) bereitzustellen. Sie können einen Benutzer dazu zwingen, zumindest bestimmte Methoden zu überschreiben, indem Sie eine Ausnahme in der Implementierung dieser Methoden in Ihrer abstrakten Klasse auslösen:
[NSException raise:NSInternalInconsistencyException
format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];
Wenn Ihre Methode einen Wert zurückgibt, ist es ein bisschen einfacher, die
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
userInfo:nil];
da Sie dann keine Rückgabeanweisung für die Methode hinzufügen müssen.
Wenn die abstrakte Klasse wirklich eine Schnittstelle ist (d. h. keine konkreten Methodenimplementierungen hat), ist die Verwendung eines Objective-C-Protokolls die geeignetere Option.