オブジェクト指向の設計では、一度作成されたシステム(クラス)は再利用可能であるべきだと考えられています。 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 メソッドを利用することはできません。