クラスの継承

クラスの継承に関してです。
クラスは、別のクラスを継承することができます。
クラス間で、親子関係みたいな感じになります。
親クラスをスーパークラス、子クラスをサブクラスと言います。
それで、実際は、インターフェイスに継承の定義を書きます。
前回作った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