ソース
#import <objc/Object.h>
#import <stdio.h>
@interface Test : Object {
int a;
@protected
int b;
@public
int c;
@private
int d;
}
- (int) getB;
- (int) getD;
@end
@interface TestSub : Test
- (int) getA;
@end
@implementation Test
- (id) init {
[super init];
a = 0;
self->b = 0;
self->c = 0;
self->d = 0;
return self;
}
- (int) getB {
return self->b;
}
- (int) getD {
return self->d;
}
@end
@implementation TestSub
- (id) init {
[super init];
self->a = 10;
self->b = 10;
self->c = 10;
printf("Test#init\r\n");
return self;
}
- (int) getB {
return self->b + self->b;
}
- (int) getA {
return self->a;
}
@end
int main() {
TestSub *obj = [[TestSub new] init];
Test *obj2 = [[TestSub new] init];
obj->c = 100;
printf("b: %d\r\n", [obj getB]);
printf("c: %d\r\n", obj->c);
printf("d: %d\r\n", [obj getD]);
printf("a: %d\r\n", [obj getA]);
[obj free];
[obj2 free];
return 0;
}
メモ
- インスタンス変数は、@private, @protected, @public で公開範囲を指定できる。デフォルトは、@protected
- @private: クラス内で参照可能。派生クラスからも参照不可。
- @protected: クラス、派生クラス内で参照可能。
- @public: 他クラスから参照可能。
- 変数定義の型を 親クラスにした場合は、親クラスのメソッドしか使えない。
- オブジェクトの代入も方向があうか、合わなくてもキャストすれば可能
- オーバーライドは普通にできる。