オブジェクト指向の設計では、一度作成されたシステム(クラス)は再利用可能であるべきだと考えられています。 Objective-C で正しく設計されたクラスは、簡単にその機能を拡張することができるのです。 それも、自分が作ったクラスでも、他人が作ったクラスでも関係なく利用することができます。
私たちは、これまでルートクラスの Object クラスを継承してきましたが、私たちが独自に作成したクラスを、さらに異なるクラスに継承させることもできるのです。 クラスを継承するとき、新しく生成されるクラスをサブクラスと呼び、継承元のクラスをスーパークラスと呼びます。
サブクラスはスーパークラスの機能をそのまま引き継ぐため、スーパークラスで定義されているメソッドを利用することができます。 これに加えて、必要な機能をさらに追加することがサブクラスの役割です。
#import <stdio.h> #import <objc/Object.h> @interface SuperClass : Object - (void)methodA; @end @interface SubClass : SuperClass -(void)methodB; @end @implementation SuperClass - (void)methodA { printf("SuperClass.methodA\n"); } @end @implementation SubClass - (void)methodB { printf("SubClass.methodB\n"); } @end int main() { id obj = [SubClass alloc]; [obj methodA]; [obj methodB]; return 0; }
このプログラムで定義している SubClass クラスは SuperClass クラスを継承しています。 このとき、SubClass は SuperClass のサブクラスであり、SuperClass は SubClass のスーパークラスであると表現することができます。 SubClass は SuperClass の機能を継承しているため、SubClass のインスタンスは SuperClass の機能をそのまま利用することができます。
このプログラムでは、SuperClass で methodA メソッドを、SubClass で methodB を宣言しています。 SubClass が methodB を利用できるのは当然ですが、main() メソッドのコードを見て確認できるように、SubClass のインスタンスはスーパークラスの SuperClass で宣言されている methodA を呼び出すこともできるのです。
クラスのインスタンスを作成するための alloc メソッドは宣言せずに呼び出すことができましたが、これも Object ルートクラスを継承していたから利用できたのです。 事実 Object ルートクラスを継承しなければ alloc メソッドを利用することはできません。