Objective-C で学ぶオブジェクト指向 更新日: 10/12 オブジェクト指向 ● クラスを使うプログラミング方法 ● Objective-C はオブジェクト指向言語 ● 他には Java や C++ など クラスとは ● 属性(変数)と機能(メソッド)をまとめたもの ● C でいう構造体に似ている(構造体は変数のみ) ● Objective-C では属性をインスタンス変数という 人間クラス 人間 名前 歩く 考える 具体的に (Objective-C では ) File メニュー→ New→File...→CocoaClass でクラスファイルを 作成 (Xcode6.1 の場合 ) Human.h Human.m クラスの利用方法 1.生成する 2.設定をする 3.メッセージを送る この3つは、すべてのクラスで同じ 生成する ● ● クラスは設計図のようなものなので、利用する にはオブジェクトの生成を行わなければならな い この生成したオブジェクトをインスタンスとい う [ [ クラス名 alloc] init] で生成と初期化を行う 例: Human クラスのインスタンス takasi を生成する場合 Human takasi=[[Human alloc] init]; 設定をする ● ● セッターと呼ばれるメソッドを使って、インス タンスが持っているものの設定を行う set 変数名の形をしている 例: Human クラスのインスタンス takasi の名前を設定 [takasi setName:@" たかし "]; メッセージを送る ● インスタンスのメソッドを呼び出して、操作す る 例: Human クラスのインスタンス takashi に歩くメッセージ を送る [takasi walk]; 実行してみよう まず ViewController.m の上で import 文を書いて Human.h をインポートしておく ViewController.m の viewDidLoad メソッドの中に実行コードを書く takasi を動かす 実行結果 オブジェクト指向の重要な概念 ● カプセル化 ● 継承 ● 委譲 カプセル化 オブジェクトの仕様を内部に隠蔽して、ソフト ウェアの保守性を高める手法 つまりはオブジェクトを外から 操作するときに、簡単に不具合 なく操作できるようにする カプセル化の手法 変数を直接外部からアクセス ( 代入や値の利 用 ) できないようにする じゃあどうやって変数にアクセスするのか セッター、ゲッターと呼ばれる メソッドを使う セッターとゲッター 変数に値を代入するときはセッターと呼ばれる メソッドを使う [takasi setName:@" たかし "]; また、値を取ってくる場合はゲッターと呼ばれ るメソッドを使う NSString* name=[takasi name]; 命名規則について 各プログラミング言語には、メソッドなどに名 前をつける場合一定の法則に従ってつけるとい うルールがある Objective-C では ● セッターは set 変数名 ● ゲッターは 変数名 ● インスタンス変数は _ 変数名 カプセル化をやってみよう ● ● 例:人間に「あほ」という名前をつけようとした 現実世界で考えたらそんな名前をつけた場合、いじめられ ますよね?おそらく役所で止められるでしょう。でも現状 それを止める手段がありません ここで役所の代わりができるようセッターを書き換えます これで setName の引数を「あほ」にして実行してみてくださ い。怒られます。 ● ● このように、セッターは変な値を入れられないようにするものなの です。他の例で言うと、身長なのにマイナスの値を入れようとした のを防ぐなど。 (ここの説明はあくまでざっくりとしたものです) 継承 ● ● オブジェクト指向でとても大事なもの あるクラスの属性・機能をそのまま引き継いで 新しいクラスを作ることができる → 元のクラスに影響を与えることないため、保守性 が高い 継承 人間 元のクラス 名前 歩く 考える 継承 学生 名前 学年 歩く 考える 勉強する 「人間」クラスを継承し て新しく作った「学生」 クラス コードを書いてみよう Student.m Student.h 実行してみよう import を忘れずに行うこと setName や think メソッドは Student クラス で記述していないのに、実行できる! 継承の利点 ● 元からあるコードに手を加えずに、再利用をす ることができる ● ● 新しいコードを書いた時にバグが発生して動かなく なっても、元のコードは大丈夫 元からあるコードを変更することになっても、 それを継承しているクラスのコードは変更しな くてもいい init メソッド Human takasi=[[Human alloc]init]; というのは分割すると Human takasi=[Human alloc]; [takasi init]; と書いているのと一緒 あれ? Human クラスに init メソッドなんて あった? init ここで Human.h を見返してみよう @interface Human:NSObject Human は NSObject を継承している init メソッドはこの NSObject クラスで定義さ れているので、それを継承したクラスである Human でも使うことができる じゃあ NSObject って? ● ● オブジェクトとして必要なものが最低限度書い てあるクラス ユーザーが自分でクラスを作るときは、必ずこ れを継承する
© Copyright 2024 ExpyDoc