Objective-C クラスメソッド 【初級編 第5回】
前回のコードではBMIを計算するクラスを作成しましたが、ただの計算をするだけのクラスにインスタンス化が
必要なのかということを考えると、あの程度のプログラムでは必要ないといえるでしょう。
インスタンス化
そこで前回のプログラムを少々改良します。
ヘッダーファイル「Bmi.h」から。書き換えついでに処理を増やしました。
Bmi.hファイル
#import <objc/Object.h> @interface Bmi:Object //BMI値を計算 +(double)calcBmi:(double)weight height:(double)height; //適正体重を計算 +(double)calcProperWeight:(double)height; @end
続いて実装部分 今回はmain関数のファイルも分けます。
Bmi.hファイル
#import "Bmi.h" @implementation Bmi +(double)calcBmi:(double)weight height:(double)height{ return weight/(height*height); } +(double)calcProperWeight:(double)height{ return (height * height * 22); } @end
main.mファイル
#import <objc/Object.h> #import "Bmi.h" int main(){ printf("%2.1fn",[Bmi calcBmi:55.0 height:1.72]); printf("%2.1fn",[Bmi calcProperWeight:1.72]); return 0; }
コンパイルは以下のように行って下さい。
gcc -o test main.m Bmi.m -lobjc
さて前回から変わったとことはメソッドが1つ増えたぐらいでほんのわずかです。
1つ目のメソッドは体重と身長を引数に指定するとBMIを計算して返すものです。
2つ目のメソッドは身長から適正体重を計算して返すものとなります。新たに付け加えたものですね。
もともとあったメソッドの方はヘッダーファイルでのメソッド定義が前回と違い、「+」に変わっています。
第3回で述べたようにこれはクラスメソッドとなります。
インスタンスメソッドはインスタンス化しなければ使えませんが、クラスメソッドは
インスタンス化しなくても使用できます。
「main.m」の4行目、5行目を見てください。
[Bmi calcBmi:55.0 height:1.72]
前回までの処理では「alloc」でメモリを確保した後に、メッセージ式を使用して
メソッドを呼び出していましたが、今回は「alloc」を使用することなしに呼び出しており、
レシーバはクラスそのものになっています。こういった使い方ができるのがクラスメソッドです。
インスタンスメソッドをクラスメソッドのように呼び出すと以下の警告がでました。
「Bmi.h」と「Bmi.m」のメソッドを「-」に変えてみてください。
じゃ全部クラスメソッドにすればいいんではないだろうかと思われる方もいるかもしれませんが、
クラスメソッドには制約があります。インスタンス内に保持されている値にはアクセスできません。
単に与えられた数値を基に計算して返すといった処理であれば問題ありませんが、インスタンス内部の状態に依存した
処理を行う場合はインスタンスメソッドで作成する必要があると思います。
今回のまとめとしては
- クラスメソッドはインスタンス化せずに呼び出すことができる
- クラスメソッドにメッセージを送信するときは[クラス メッセージ]を使用する
- クラスメソッドは制約がある
といったところでしょうか。
TechProjin 開発系基礎講座 連載リンク
基礎からPHPWEBアプリ解発を学ぶなら・・
PHP基礎 連載
AIなどで注目急上昇!これから学ぶならPython!!
独学で学ぶ-pythonプログラミング 連載
汎用性◎ 定番プログラミング言語JAVA
Java基礎講座 連載