2011年2月1日火曜日

Objective-C(メソッド定義)

クラスメソッドとインスタンスメソッド

クラス・メソッドの定義はヘッダファイルに@interface から始まり@endで終了するブロック内に定義します。メソッドの先頭に付いている「 - 」ですが、これにはちゃんと意味があって、「 - 」がインスタンスメソッド、「 + 」がクラスメソッドという区別になります。

修飾子意味
- インスタンスメソッド
例)[instance method];
+ クラスメソッド。javaのstaticなメソッドと同等です。NSObjectクラスのallocメソッド等がこれに該当します。
例)[Class method];

メソッドのオーバーライド

Objective-CもC++やJavaと同じようにメソッドのオーバーライドがが可能です。特に説明するまでも無く、サンプルを見ていただければ理解出来ると思います。

#import <Foundation/NSObject.h>
#import <stdio.h>

@interface A : NSObject {
    int a;
    int b;
}
- (id) init;
- (int) add;

@end

@implementation A 
- (id) init {
    self = [super init];
    if (self != nil) {
        a = 1;
        b = 5;
    }
    return self;
}
- (int) add {
    return a + b;
}
@end


@interface B : A {
}
- (id) init;
- (int) add;    //オーバーライド

@end

@implementation B
- (id) init {
    self = [super init];
}

//オーバーライド
- (int) add {
    return a + b + 10;
}
@end

int main(void) {

    A *classA = [[A alloc] init];
    int value = [classA add];

    B *classB = [[B alloc] init];
    int value2 = [classB add];

    printf("Class A value : %d\n", value);
    printf("Class B value : %d\n", value2);

    return 0;
}
オーバーライドサンプルコード

以下、実行結果
Class A value : 6
Class B value : 16


上のクラスはクラスBはクラスAを継承しており、クラスBのメソッド「add」はクラスAのメソッド「add」をオーバーライドしています。
オーバーライドメソッドからスーパークラスのメソッドを呼び出すにはこのようにします。
- (int) add {
    return [super add]; //スーパークラスのメソッドを呼び出し
}
スーパークラスメソッドの呼び出し

このあたり、はc++/Javaと同様ですので、すんなり理解できます。

0 件のコメント :

コメントを投稿