昨日の続き。
今回は第3章「Classes, Objects, and Methods(クラス、オブジェクト、メソッド)」。
内容はオブジェクト指向入門。
オブジェクト指向では、プログラムする対象がどういうモノなのかというところに焦点を当てて考える。
たとえば、自分や家族の車を対象とするプログラムを書きたいとする。自分の車や家族の車は、車の一種である(is-a関係)。
言い方を変えると、車というクラス(種)のインスタンス(実例)である。
車には、ボディの色をはじめとしたステートがあり、このようなステートは各インスタンスの変数が保持する。
また、車に対しては、何かを行なうことができるが、クラスやインスタンスに対するアクションをメソッドという。
クラスやインスタンスにメソッドを適用するには、プログラムでは以下のように書く。
[ クラスやインスタンス メソッド ];
これはレシーバにメッセージを送るとも呼ばれ、以下のようにも書く。
[ レシーバ メッセージ ];
メソッドに引数がある場合には、以下のように書く。
[ クラスやインスタンス メソッド: 引数];
プログラムには、@interface部、@implementation部、プログラム部がある。
@interface部は、クラスが持っている変数とメソッドのプロトタイプ宣言を書く。
@implementation部は、メソッドの処理を実際に書く。
プログラム部では、クラスに属するインスタンスを実際に作って、それを使う。
1つのファイルに全部入れる場合、プログラムの構造は以下のようになる。
#import <stdio.h>
#import <objc/Object.h>
@interface クラス名: Object(ないしは親のクラス名)
{
型 インスタンス変数名1;
型 インスタンス変数名2;
…
}
メソッドの種類(返り値の型) メソッド名1: (型) 仮引数名;
メソッドの種類(返り値の型) メソッド名2: (型) 仮引数名;
…
@end
@implementation クラス名;
メソッドの種類(返り値の型) メソッド名1
{
処理
…
}
メソッドの種類(返り値の型) メソッド名2
{
処理
…
}
…
@end
int main(int argc, char *argv[])
{
クラス名 *インスタンスを参照する変数名;
インスタンスを参照する変数名 = [クラス名 alloc]; //インスタンスをメモリ内に用意
[インスタンスを参照する変数名 init]; //インスタンスを初期化
処理
…
[インスタンスを参照する変数名 free]; //インスタンスをメモリから消す。
return 0;
}
ここで、メソッドの種類は、「-」ならインスタンスに対するメソッド、「+」ならクラスに対するメソッド。
allocとinitの2行は、以下の1行でもOK。
インスタンスを参照する変数名 = [クラス名 new];
インスタンス変数の値をクラスの外から参照できるようにするため、インスタンス変数名を持ち、インスタンス変数の値を返すメソッドを用意することもある。
最近のコメント