クラスの継承
クラスの継承に関してです。
クラスは、別のクラスを継承することができます。
クラス間で、親子関係みたいな感じになります。
親クラスをスーパークラス、子クラスをサブクラスと言います。
それで、実際は、インターフェイスに継承の定義を書きます。
前回作ったPersonクラスを継承して、Regularクラスを作りたい場合は、
インターフェイスにPersonを継承するように定義します。
#import <Foundation/Foundation.h> #import "Person.h" @interface Regular : Person @end
Personを継承させる為には、Reqularのインターフェイス内で、Personのインターフェイスを
importしないといけません。
それと、クラスの初期化(イニシャライザ)に関しても書いておきます。
インスタンス変数を初期化したい場合に、initメソッドをオーバーライドして、
初期化を行うことができます。
Personのインターフェイスにinitメソッドを定義します。
#import <Foundation/Foundation.h> @interface Person : NSObject { @private NSNumber *personId; @private NSString *personName; @protected NSString *position; ← 初期化時に文字列を格納するインスタンス変数 } - (id)init; ← イニシャライザメソッド ...... @end
それで、Personのクラスにinitメソッドの実装を定義します。
#import "Person.h" @implementation Person - (id)init { self= [super init]; if (self != nil) { position = @"person"; NSLog(@"%@", position); } return self; } .... @end
初期化に関してですが、selfは、インスタンス自身を表しています。
それで、initメソッドをオーバーライドした場合、
必ずスーパークラスの初期化を呼び出します。
なので、[super init]で、スーパークラスを初期化してます。
Personクラスをインスタンス化すると、position変数に"person"の文字列が設定されます。
続いて、継承したRegularクラスにも同じことを定義します。
Regularのインターフェイス定義は、下の様な感じです。
#import <Foundation/Foundation.h> #import "Person.h" @interface Regular : Person - (id)init; @end
その実装クラスにinitメソッドをオーバーライドして、初期化処理を定義します。
#import "Regular.h" @implementation Regular - (id)init { self = [super init]; if (self != nil) { position = @"regular"; NSLog(@"%@", position); } return self; } @end
テストするクラスを作成します。
#import <Foundation/Foundation.h> #import "Regular.h" int main(int argc, const char * argv[]) { Regular *regular = [[Regular alloc]init]; return 0; }
実行した結果は、下の様になります。
2012-06-28 00:48:04.433 developer06[9634:403] person 2012-06-28 00:48:04.435 developer06[9634:403] regular