カスタム検索

2008年12月16日火曜日

いまさら聞けない「Objective-C」超入門 Objective-C その3

そんなこんなで継承について

スーパークラスとかサブクラスとか継承の考え方はJavaとまったく一緒、省略
Cocoa環境では基本的にNSObjectというのがルートクラスとなる。JavaでいうObject的なものっぽい。
C++にはこういったすべてのベースとなるルートクラスがないらしい(!)

では実際に以下のような継承クラスを作成してみる
Parent = ルートクラス callNumber(int) で value に値をセットし、受け取った値を返す
Child = Parentのサブクラス、callNumber(int) をオーバーライドし、 受け取った2倍の値を返す
Grandchild = Childのサブクラス、callNumberでセットされた value の3倍の値を返す anotherNumber メソッドを追加

Parent.h

#import

@interface Parent : NSDocument {
int value;
}
- (int)callNumber:(int)num;

@end


Parent.m

#import "Parent.h"

@implementation Parent
- (int)callNumber:(int)num {
value=num;
return num;
}

@end


Child.h

#import
#import "Parent.h"

@interface Child : Parent {
}
-(int)callNumber:(int)num;

@end


Child.m

#import "Child.h"

@implementation Child
-(int)callNumber:(int)num {
value=num;
return num * 2;
}

@end


Grandchild.h

#import
#import "Child.h"

@interface Grandchild : Child {
}
-(int)anotherNumber;

@end


Grandchild.m

#import "Grandchild.h"

@implementation Grandchild
-(int)anotherNumber{
return value * 3;
}
@end


そしてこれらを実行して結果を出力する main.m
せっかくなんで入力された文字のキーコードを出力する q で終了


#import
#import "Parent.h"
#import "Child.h"
#import "Grandchild.h"

int main(void)
{
id p,c,g;
char buf[8];

p=[Parent alloc];
c=[Child alloc];
g=[Grandchild alloc];

while(scanf("%s",buf) > 0) {
switch(buf[0]) {
case 'q':return 0; break;
default:
printf("parent class >> %d\n",[p callNumber:buf[0]]);
printf("child class >> %d\n",[c callNumber:buf[0]]);
[g callNumber:buf[0]];
printf("grandchild class >> %d\n",[g anotherNumber]);
break;
}
}

return 0;
}


今日のポイント
Javaと違う所!
interfaceはクラスには必ず存在し、Javaのように同じインターフェースを持った別のクラスみたいな考えではない
同じような事をやる場合はインターフェース用のクラスを作成する、もちろんクラスだからインターフェースもいる
インターフェース用クラスのインターフェースとかどんだけ〜

なんで import は h ファイルだけでいいのか、昨日の謎がとけた!
早くぐりぐり動かしたいな〜

0 件のコメント: