The Bait in NC

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 って?
●
●
オブジェクトとして必要なものが最低限度書い
てあるクラス
ユーザーが自分でクラスを作るときは、必ずこ
れを継承する