インスタンス変数

ソース

#import <objc/Object.h>
#import <stdio.h>

@interface Test : Object {
	int	a;		// aとb は同じ
  @protected
	int	b;		// aとb は同じ
  @public
	int	c;
  @private
	int	d;
}
- (int) getB;	// override用
- (int) getD;	// private 参照用
@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;
	//self->d = 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];

	//obj2 = obj;				// 代入可能
	//obj = (TestSub*)obj2;	// キャストすれば代入可能

	obj->c = 100;
	//printf("b: %d\r\n", obj->b);		// privateは参照不可
	printf("b: %d\r\n", [obj getB]);	// overrideされたメソッドが実行される
	printf("c: %d\r\n", obj->c);		// publicの参照
	printf("d: %d\r\n", [obj getD]);	// メソッドからはprivate変数も参照可能
	printf("a: %d\r\n", [obj getA]);	// TestSubにしかないメソッド。obj2からは実行不可

	[obj free];
	[obj2 free];
	return 0;
}

メモ

  • インスタンス変数は、@private, @protected, @public で公開範囲を指定できる。デフォルトは、@protected
    • @private: クラス内で参照可能。派生クラスからも参照不可。
    • @protected: クラス、派生クラス内で参照可能。
    • @public: 他クラスから参照可能。
  • 変数定義の型を 親クラスにした場合は、親クラスのメソッドしか使えない。
  • オブジェクトの代入も方向があうか、合わなくてもキャストすれば可能
    • 親子関係ない場合は代入不可。
  • オーバーライドは普通にできる。