Objective-C doesn’t have the abstract class construct. The common approach to mimic it is to use NSObject’s doesNotRecognizeSelector:
@interface ShapeBase : NSObject {} - (void)draw { [self doesNotRecognizeSelector:_cmd]; } @end @interface Circle : ShapeBase {} // missing draw method @end
This forces subclasses to override, otherwise you get a runtime exception. There’s also another approach we can take using a formal protocol.
@protocol ShapeBehavior - (void)draw; @end @interface ShapeBase : NSObject {} @end @interface Circle : ShapeBase<ShapeBehavior> {} @end // Compile error, missing draw method
Let’s also add some sugar so we don’t have to type ShapeBehavior every time we want to use a shape:
typedef ShapeBase<ShapeBehavior> Shape; // Before typedef ShapeBase<ShapeBehavior> *circle = [[Circle alloc] init]; [circle draw]; // After typedef Shape *circle = [[Circle alloc] init]; [circle draw];
Using formal protocols gives you errors earlier in the development process but the trade-off is that it’s not as lightweight as simply using doesNotRecognizeSelector.