第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 おわりに • 継承 – 局所的なメソッド – 指定イニシャライザ • 動的結合 – 動的結合 – ポリモルフィズム
© Copyright 2024 ExpyDoc