Document

第6回 iPhoneアプリ勉強会
纐纈 直也
Jul. 1. 2009
はじめに
• 継承
– 局所的なメソッド
– 指定イニシャライザ
• 動的結合
局所的なメソッド
• 下請けに当たるメソッドの定義
@interface ClickVolume: Volume
- (id) up;
- (id) down;
@end
@implementation ClickVolume
- (void) playClick { // クラス定義内部で局所的なメソッド
/* クリック音を出す */
}
- (id) up {
[self playClick];
return [super up];
}
-(id) down{
[self playClick];
return [super down];
}
@end
ここ以外で使わないので
playClickを記述しない
指定イニシャライザ
• イニシャライザ:初期化用のメソッド
– クラスに複数存在する場合がある
• 指定イニシャライザ
– 必須の働きをするイニシャライザ
• 副次的イニシャライザ
– 呼び出しに便利なイニシャライザ
– 指定イニシャライザをselfで呼び出して実現
指定イニシャライザ
クラスB
クラスA
ルートクラス
まで続く
副次的イニシャライザ
指定イニシャライザ
指定イニシャライザ
副次的イニシャライザ
継承
副次的イニシャライザ
継承
サブクラスの指定イニシャライザは
スーパークラスの指定イニシャライザ
を呼び出して定義
super
self
クラスC
指定イニシャライザ
副次的イニシャライザ
副次的イニシャライザ
指定イニシャライザ
• 指定イニシャライザはオーバーライドしなくて
もいい
• 副次的イニシャライザはスーパークラスの
副次的イニシャライザを継承できるが問題が
起こる可能性がある
クラスB
クラスA
ルートクラス
まで続く
副次的イニシャライザ
指定イニシャライザ
指定イニシャライザ
副次的イニシャライザ
継承
副次的イニシャライザ
動的結合
• 送られた処理に対応してどのメソッドが実行さ
れるのか実行時に決定される方式
@ interface A : NSObject
- (void) whoAreYou;
@end
int main(void){
id obj;
int n;
@implementation A
- (void) whoAreYou { printf(“I’m A\n”); }
@ end
scanf(“%d”, &n);
switch (n) {
case 0: obj = [[A alloc] init]; break;
case 1: obj = [[B alloc] init]; break;
case 2: obj = [[NSObject alloc] init]; break;
}
[obj whoAreYou];
return 0;
@ interface B : NSObject
- (void) whoAreYou;
@end
@implementation B
- (void) whoAreYou { printf(“I’m B\n”); }
@ end
}
NSObjectにwhoAreYouメソッドはない
ポリモルフィズム
• 同じメッセージを送ってもオブジェクトに応じて
適切なメソッドが実行される性質
@ interface A : NSObject
- (void) whoAreYou;
@end
int main(void){
id obj;
int n;
@implementation A
- (void) whoAreYou { printf(“I’m A\n”); }
@ end
scanf(“%d”, &n);
switch (n) {
case 0: obj = [[A alloc] init]; break;
case 1: obj = [[B alloc] init]; break;
}
[obj whoAreYou];
return 0;
@ interface B : NSObject
- (void) whoAreYou;
@end
}
@implementation B
- (void) whoAreYou { printf(“I’m B\n”); }
@ end
おわりに
• 継承
– 局所的なメソッド
– 指定イニシャライザ
• 動的結合
– 動的結合
– ポリモルフィズム