第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」 古川 拓弥
継承とは あるクラスの定義を引き継いで新しく定義する サブクラスはスーパークラスの機能をすべて利用可能 サブクラスで行うこと 継承の元となるクラス:スーパークラス(superclass) 新しく作るクラス:サブクラス(subclass) サブクラスはスーパークラスの機能をすべて利用可能 サブクラスで行うこと 新しいメソッドの追加 新しいインスタンスの追加 スーパークラスのメソッドを別の定義で置き換える 上書き(override)
継承の概念 スーパークラス 継承 継承 サブクラス サブクラス 変数 x :新しく追加 :上書き(override) method1 クラスA 継承 継承 サブクラス サブクラス 変数 x 変数 x method1 method1 method2 変数 y method2 method3 クラスB クラスC サブクラスではスーパークラスのインスタンス変数やメソッドにアクセス可能 インスタンス変数,メソッドの宣言は新たに付け加えるもののみを記述
クラスBはクラスDに対してはスーパークラスとなる 継承の概念 変数 x :新しく追加 :上書き(override) method1 method2 クラスA 継承 継承 スーパークラス 変数 x 変数 x method1 method1 method2 変数 y method2 method3 クラスB クラスC 継承 サブクラス 変数 x method1 クラスBはクラスDに対してはスーパークラスとなる method2 method3 クラスD
継承の概念 ルートクラス 継承 継承 継承 ルートクラス それ以上スーパークラスを持たないクラス 変数 x :新しく追加 :上書き(override) method1 method2 クラスA 継承 継承 変数 x 変数 x method1 method1 method2 変数 y method2 method3 クラスB クラスC 継承 変数 x それ以上スーパークラスを持たないクラス ルートクラス method1 method2 method3 クラスD
すべてのクラスはルートクラスを継承しなければならない 継承関係の宣言 インターフェース部 実装部 @interface クラス名 : スーパークラス { //インスタンス変数の宣言 ・・・ } //メソッドの宣言 @end すべてのクラスはルートクラスを継承しなければならない NSObject @implementation クラス名 //メソッドの定義 ・・・ @end
継承するクラスがないときにはNSObjectを継承する 継承の例 インターフェース部 実装部 @interface Car : NSObject { char *name } - (void)printName; @end 継承するクラスがないときにはNSObjectを継承する @implementation Car - (void)printName{ name = “カローラ”; printf(“車の名前は%sです\n”, name); } @end
クラス定義とヘッダファイル インターフェース部は1つのヘッダファイルとして作成 #import <Foundation/NSObject.h> @interface Alpha : NSObject { ・・・ } - (void)doSomething @end #import “Alpha.h” @implementation Alpha - (void)doSomething{ ・・・ } @end Alpha.h Alpha.m #import “Alpha.h” @interface Beta : Alpha { ・・・ } @end #import “Beta.h” @implementation Beta ・・・ @end Beta.h Beta.m #import “Beta.h” @interface Gamma : Beta { ・・・ } @end #import “Gamma.h” @implementation Gamma ・・・ [self doSomething]; @end Gamma.h Gamma.m
メソッドの呼び出し [self method] self クラス内の他のメソッドの呼び出し 継承 継承 selfという名前にメッセージを送る クラスA クラスB クラスC method1 method2 method3 method1 method1 method2 method2 method3 [self method1] [self method2] method3 インスタンス化 インスタンス化 メッセージ処理を行っているインスタンス自身 self メッセージ送信 メッセージ送信
メソッドの呼び出し [super method] super スーパークラスのメソッドの呼び出し 継承 継承 クラスA クラスB クラスC method1 method2 method3 method1 method1 method2 method2 method3 [super method1] [super method2] method3 継承した親クラスのメソッドを使うことを表す super