2011年2月10日木曜日

Objective-C(抽象クラス)

Javaで言うところのabstract、C++でのvirtualのような抽象クラスの言語上の仕組みはObjective-Cにはありません。ですが、言語上に制約はありませんが、継承の概念を用いて抽象クラスっぽい(?)事が出来ます。

//Person class.
@interface Person : NSObject {
}
- (id) init;
- (void) sayName;
- (void) whatYourName;
@end

@implementation Person
- (id) init {
    return [super init];
}

//お名前メソッド。Personクラスでは無名ということで、名前は分かりません。
- (void) sayName {
    printf("自分の名前分かりませーん。\n");
}
- (void) whatYourName {
    [self sayName];
}
@end

//佐藤さんクラス(仮称)
@interface Sato : Person {
}
- (id) init;
- (void) sayName;
@end;

@implementation Sato
- (id) init {
    return [super init];
}
 //お名前メソッド 
- (void) sayName {
    printf("私は佐藤です。\n");
}
@end

//加藤さんクラス(仮称)
@interface Kato : Person {
}
- (id) init;
- (void) sayName;
@end

@implementation Kato
- (id) init {
    return [super init];
}
 //お名前メソッド
- (void) sayName {
    printf("私は加藤です。\n");
}
@end

//main
int main(void) {
    id pool = [[NSAutoreleasePool alloc] init];
    //佐藤さんインスタンス、Person型で定義していることに注意。
    Person *sato = [[[Sato alloc] init] autorelease];
    //加藤さんインスタンス、Person型で定義していることに注意。
    Perpson *kato = [[[Kato alloc] init] autorelease];

    //普通にメソッドを呼び出し 
    [sato sayName];
    [kato sayName];
 
    //親クラスのメソッド呼び出し、サブクラスのメソッドが呼び出される
    [sato whatYourName];
    [kato whatYourName];

    [pool release];
    return 0;
}

実行結果

私は佐藤です。
私は加藤です。
私は佐藤です。
私は加藤です。

メイン関数内の

//普通にメソッドを呼び出し 
 [sato sayName];
 [kato sayName];

では、親クラスの型に対して、親クラスのメソッドsyaNameが呼び出されるわけではなく、それぞれサブクラスのメソッドが正しく呼び出されています。

//親クラスのメソッド呼び出し、サブクラスのメソッドが呼び出される
 [sato whatYourName];
 [kato whatYourName];

では、親クラスにのみ定義されているwhatYourNameメソッドを呼び出し、そのメソッド内からサブクラスの呼び出しが正しく行われています。Java/C++のように言語上のサポートはありませんが、抽象クラスとしては同様の事が可能なようです。

0 件のコメント :

コメントを投稿