Object-CはC++に似て、クラスの定義にヘッダーを必要とします。
変数・関数の宣言に順番を気にしなければならなかったCの名残りといえるでしょう。
定義と実装は別々に行います。
Javaの場合には、そんなものは必要がなく、publicクラスにそれぞれ独自のファイルを用意してクラスの実装のみを記述します。
#importでクラスを指定さえすれば、順番も関係なく使用することができます。
Object-Cのクラス宣言と実装、呼び出しの方法を下記に示します。
#import <stdio.h>
#import <Foundation/NSObject.h>
@interface Test:NSObject
-(void) hello;
@end
@implementation Test
-(void)hello
{
printf("Hello NSObject\n");
}
@end
int main()
{
id obj=[Test alloc];
[obj hello];
return 0;
}
コンパイラオプションはこちらを使いました。
gcc nsclass.m -I c:/GNUstep/GNUstep/System/Library/Headers -L c:/GNUstep/GNUstep/System/Library/Libraries -lobjc -lgnustep-base
Objective-Cは引数の指定の仕方が独特です。
型をいちいち指定して呼び出します。
Javaのように引数とメンバ変数を同名にすると警告が出ます。
#import <stdio.h>
#import <Foundation/NSObject.h>
@interface Test:NSObject
{
int index;
}
- (void) hello;
- (void) setIndex:(int) i;
@end
@implementation Test
- (void) setIndex:(int) i
{
self->index=i;
}
-(void)hello
{
printf("Hello NSObject %d\n",self->index);
}
@end
int main()
{
id obj=[Test alloc];
[obj setIndex:10];
[obj hello];
return 0;
}