継承


機能の拡張

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



前のページへ戻る次のページへ