スーパークラスとかサブクラスとか継承の考え方は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 件のコメント:
コメントを投稿