super
クラスを継承した子クラスでは、親クラスを同じ名前のメソッドを作り、処理を置き換えることが出来る。これをオーバーライドという。
オーバーライドした時でも、親のメソッドを呼び出す必要がある場合は「super」を使う。
(親クラスは英語で「SuperClass」と書く。子クラスは「SubClass」。)
@interface SuperClass : NSObject
// 変数がないので{}は省略
- (void)method;
@end
@interface SubClass : SuperClass
// 変数がないので{}は省略
-(void)method; // 同一名関数を作りオーバーライドする
@end
@implementation SuperClass
- (void)method
{
printf("SuperClass.method\n");
}
@end
@implementation SubClass
-(void)method
{
printf("SubClass.method\n");
[super method]; // [SuperClass method]を呼び出す
}
@end
void CallMethod(id obj)
{
[obj method];
}
int main()
{
CallMethod([SuperClass alloc]); // [SuperClass method]が実行される
CallMethod([ SubClass alloc]); // [SubClass method]が実行される→その中で[SuperClass method]も呼び出される
return 0;
}
実行結果(未確認)
SuperClass.method
SubClass.method
SuperClass.method
こうした時、CallMethod()は引数によって呼び出し関数を変更することになる。
Cではswitch caseか関数のアドレスを持つ配列を使った呼び出しUByte (*fnc)()[]を使ったが、
その辺りの記述が大幅に簡潔になる。
superはselfとは違いアドレスを示すものではなく予約語なので、super->という使い方は出来ない。
0 件のコメント:
コメントを投稿