2009/06/17 第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス鷲見政明 FLAB iPhone 2009/06/17 はじめに • オブジェクト指向の考え方 • Objective-C – クラスの作成 – アクセサの実装 – イニシャライザの実装 FLAB iPhone 2009/06/17 オブジェクト指向の考え方 例.ファイルにデータを書き込むプログラム 1.書き込むデータをDBから取得 2.取得したデータをファイルに書き込む 書き込み依頼 A データ取得依頼 B C メッセージ メッセージ データ取得 書き込み FILE 自律分散協調動作 DB FLAB iPhone 2009/06/17 クラス (class) と メソッド (method) Bにはどんな機能が必要か? 書き込み依頼 A データ取得依頼 B C B クラス -データの取得を依頼する +ファイルに書き込む メソッド FLAB iPhone 2009/06/17 インスタンス変数 (instance variable)とアクセサ (accessor) Bにもっと詳細な書き込み依頼をしたい ファイル名指定 A 書き込み依頼 データ取得依頼 B C B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) -データの取得を依頼する +ファイルに書き込む +ファイル名を設定する +上書きするか否かを設定する インスタンス変数 メソッド アクセサ FLAB iPhone 2009/06/17 コンストラクタ (構築子:constructor) 詳細な書き込み依頼をしない場合のBのデフォルトの動作を設定したい 書き込み依頼 A データ取得依頼 B C B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 +初期化 -データの取得を依頼する +ファイルに書き込む +ファイル名を設定する +上書きするか否かを設定する コンストラクタ メソッド アクセサ FLAB iPhone 2009/06/17 デストラクタ (消去子: destructor) Bの終了時(※)の動作を設定したい 書き込み依頼 A データ取得依頼 B C B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 +初期化 -データの取得を依頼する +ファイルに書き込む +ファイル名を設定する +上書きするか否かを設定する +終了時の動作 コンストラクタ メソッド アクセサ デストラクタ FLAB iPhone 2009/06/17 オーバーロード (overload) 場合によっては書き込み依頼のときにファイル名を教えたい ファイル名指定 A 書き込み依頼 データ取得依頼 B C B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 +初期化 コンストラクタ -データの取得を依頼する オーバーロード +ファイルに書き込む +ファイルに書き込む(ファイル名指定) +ファイル名を設定する アクセサ +上書きするか否かを設定する +終了時の動作 デストラクタ メソッド FLAB iPhone 2009/06/17 インスタンス化 (instantiation) クラスを基に実際の値としてデータを生成 0.001 0.205 0.231 -0.981 1.321 1.051 -0.039 -1.039 class インスタンス化 (設計図) -1.212 -1.314 9.231 1.001 5.687 2.914 0.021 1.021 1.321 0.987 5.232 -3.212 0.321 1.324 0.910 0.905 解放 instance コンストラクタが走る デストラクタが走る FLAB iPhone 2009/06/17 インスタンス化 (instantiation) C言語の構造体の使い方によく似ている /* header files */ #include <stdio.h> #include <string.h> #include <stdlib.h> /* structures */ typedef struct flab_tag { int no; char name[256]; char tel[256]; } flab; /* main */ int main(void) { flab member; クラスの定義に相当 インスタンス化に相当 member.no = 6116; strncpy(member.name, "Masaaki Sumi", 255); strncpy(member.tel, "090-xxxx-xxxxi", 255); printf("no: %d\nname: %s\ntel:%s\n", member.no, member.name, member.tel); return EXIT_SUCCESS; } FLAB iPhone 2009/06/17 これまでのまとめ 以下の用語を理解しておきましょう クラス (class) メソッド (method) インスタンス変数 (instance variable) アクセサ (accessor) コンストラクタ (constructor) デストラクタ (destructor) オーバーロード (overload) インスタンス化 (instantiation) インスタンス (instance) FLAB iPhone 2009/06/17 継承 (inheritance) 異なるフォーマットのファイルに書き込む 請求ファイル 書き込み依頼 A 収入ファイル 書き込み依頼 B1 請求データ 取得依頼 C1 B2 収入データ 取得依頼 C2 BN 支出データ 取得依頼 CN ・・・・ 支出ファイル 書き込み依頼 実装に手間がかかる FLAB iPhone 2009/06/17 継承 (inheritance) ファイル #書き込むファイル名 #上書きするか?(同名ファイル有時) +初期化 #データの取得を依頼する +ファイルに書き込む +ファイルに書き込む(ファイル名指定) +ファイル名を取得する +上書きするか否かを取得する +ファイルをクローズする 請求ファイル 収入ファイル +ファイルに書き込む +ファイルに書き込む(ファイル名指定) +ファイルに書き込む +ファイルに書き込む(ファイル名指定) オーバーライド(override) FLAB iPhone 2009/06/17 継承 (inheritance) 般化 スーパークラス (親クラス:superclass) サブクラス (子クラス:subclass) サブクラス (子クラス:subclass) サブクラス (子クラス:subclass) Objective-Cは多重継承可能 特化 FLAB iPhone 2009/06/17 クラスの作成 Objective-Cのクラス インターフェース部 実装部 一般的な実装 1つのクラスで2つのファイル クラス名.h (インターフェース部) クラス名.m (実装部 ) FLAB iPhone 2009/06/17 クラスの作成 インターフェース部 @interface クラス名 : スーパークラス名 { インスタンス変数の宣言; ・・・ } メソッドの宣言; ・・・ @end 実装部 @implementation クラス名 メソッドの定義 ・・・ @end FLAB iPhone 2009/06/17 クラスの実装例 インターフェース部 @interface HelloWorld : NSObject - (void) hello; @end 実装部 @implementation HelloWorld - (void) hello { NSLog(@"Hello world!"); } @end FLAB iPhone 2009/06/17 NSObjectクラス NSObject subclass1 subclass2 ・・・ subclassN ルートクラス (root class) 基本的にすべてのクラスはNSObjectを継承しなければならない! FLAB iPhone 2009/06/17 クラスのインスタンス化 基本 [クラス名 alloc] 実用的なインスタンス化 [[クラス名 alloc] init] イニシャライザ (initializer) FLAB iPhone 2009/06/17 HelloWorld /* header files */ #import <Foundation/Foundation.h> /** class */ /* インターフェース部 */ @interface HelloWorld : NSObject - (void) hello; @end /* 実装部 */ @implementation HelloWorld - (void) hello { NSLog(@"Hello world!"); } @end /* main */ int main(void){ /* インスタンス化 */ HelloWorld *h = [[HelloWorld alloc] init]; /* helloメソッドの呼び出し */ [h hello]; /* インスタンスの解放 */ [h release]; } FLAB iPhone 2009/06/17 アクセサの実装 ゲッターの実装 インスタンス変数と同じ名前のメソッドを定義 セッターの実装 以下の名前のメソッドを定義 ・インスタンス変数名の前に”set”をつける ・setの次の文字を大文字にする FLAB iPhone 2009/06/17 アクセサの実装例 インターフェース部 @interface FileAccess : NSObject { /* インスタンス変数 */ NSString *fileName; // ファイル名 } - (NSString *)fileName; // getter [ファイル名] - (void)setFileName:(NSString *)value; // setter [ファイル名] @end 実装部 @implementation FileAccess /** * getter [ファイル名] */ - (NSString *)fileName { return fileName; } /** * setter [ファイル名] */ - (void)setFileName:(NSString *)value; { fileName = value; } @end FLAB iPhone 2009/06/17 イニシャライザ (initializer) Objective-Cはコンストラクタが存在しない インスタンス変数の初期化はどうするか? 初期化用のメソッドを作成 = イニシャライザ NSObjectクラスのイニシャライザ: initメソッド そこで initメソッドをオーバーライドして初期化処理を記述 FLAB iPhone 2009/06/17 イニシャライザの実装例 インターフェース部 @interface FileAccess : NSObject { /* インスタンス変数 */ NSString *fileName; // ファイル名 } - (id)init; // initializer @end 実装部 @implementation FileAccess /** * initializer */ - (id)init { self = [super init]; // スーパークラスのイニシャライザを呼ぶ if ( self != nil ) { fileName = @"./JoeCool.txt"; } return self; } @end FLAB iPhone 2009/06/17 おわりに • 本日の内容 – オブジェクト指向 – Objective-Cによるクラスの実装(基礎) • Next Week – 継承の実装 – インスタンス変数のスコープ FLAB iPhone
© Copyright 2024 ExpyDoc