カスタム検索

2008年12月15日月曜日

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

とりあえず前回動かしたクラスを別々のファイルにする。

インターフェース部を クラス名.h でヘッダファイルとして、実装クラスを クラス名.m とするのが一般的らしい。
クラス名.m には クラス名.h を import する。
別の実装を各場合も クラス名.h を import すればおk。

main.h 内は main だけ残して、Helloクラスを別ファイルにする
main から import するのは クラス名.h だけでおk。何でだろう?同クラス名をデフォの実装として読み込んでくれる?

Hello.h


#import

@interface Hello : NSDocument {
int val;
int min,max,step;
}
- (id)initWithMin:(int)a max:(int)b step:(int)s;
- (int)value;
- (id)up;
- (id)down;
@end



Hello.m


#import "Hello.h"

@implementation Hello
- (id)initWithMin:(int)a max:(int)b step:(int)s {
self=[super init]; // NSObjectの初期化を呼ぶ
if(self!=nil) { // nilはnullみたいなもん? init が成功していたら
val=min=a;
max=b;
step=s;
}
return self;
}

- (int)value {
return val;
}

- (id)up {
if((val += step) > max) val=max;
return self;
}

- (id)down {
if((val -= step) < min) val=min;
return self;
}
@end



main.m


#import
#import "Hello.h"

int main(void)
{
id v,w;

v=[[Hello alloc] initWithMin:0 max:10 step:2];
w=[[Hello alloc] initWithMin:0 max:9 step:3];
[v up];
printf("%d %d\n",[v value], [w value]);
[v up];
[w up];
printf("%d %d\n",[v value], [w value]);

return 0;
}




Objective-CだからといってすべてをObject指向で作る必要はない
Object型より関数型の方が軽いため、あきらかな重い処理は関数型で作成した方が良い
関数定義のみを含むソースは .c ファイルとして扱う
ただしオブジェクトを引数や返り値としたり、メソッド呼び出しなどをする場合は .m とする

#import は複数のクラスを読み込んだ場合、かぶるヘッダファイルを読み込まない
#include は読み込む。(通常はヘッダファイル内で2度読み込まないように定義しておく)
2度読み込みたい事情が無い限り #import でおk

今日はここまで!次回はクラス継承

0 件のコメント: