CHAPTER03 継承とクラス CHAPTER04 オブジェクトの型と動的結合
2011/08/24(水) 14:44 Objective-C親記事へこのエントリーをはてなブックマークに追加

クラスの継承とself

selfはメッセージを処理しているインスタンス自身を示しているため、継承したメソッドを呼んでるつもりでもインスタンス自体にあるメソッドが呼ばれる。
つまりselfは動的に変わる。

superの場合は継承したクラスのメソッドを示すことがコンパイル時の依存関係から決定するため、静的に呼び出すメソッドは決まる。

局所的メソッド

インターフェース部で宣言してなくても、メソッドを実装すればそのクラス内の局所的メソッドとして利用ができる。
だが、継承などで誤って上書きしてしまうことなどがあるため、Appleのガイドラインでは居所的メソッドに特定の接頭辞を付けることが推奨されている。

動的束縛とは

Objective-Cでは送られてきたメッセージに対応してどのメソッドが実行されるかは実行時に決定します。その方式を動的束縛、動的結合と呼ぶ

ポリモーフィズム

同じメッセージを送っても、レシーバーのオブジェクトに応じて適当なメソッドを呼ぶ性質をポリモーフィズムと呼ぶ。
[target move:direction];
この場合、変数targetがポリモーフィズムくを実現しているオブジェクトならば、オブジェクトtargetが受け取ったメッセージにより、どういう処理をするかを決めればいい。

空のポインタnil

ポインタが実体を何も示していないことを表すためにnilという値が用意されている。
nilはid型の空のポインタで、値は0になる。

型の静的チェック

Objective-Cはコンパイル時に型チェックを行います。
id型は(void *)のように何でも適応できてしまう型なので、型チェックができなくて困るので、
クラス名を型名にちゃんと使ったほうがよい。

プログラミングにおける型宣言

- (id)cellAtRow:(int)row column:(int)col;
おのようなセレクタと型情報を合わせたものをシグネチャと呼ぶことがあります。
Objective-Cにおいては基本的に、同じセレクタを持つメッセージは引数や返り値の型(シグネチャ0を同じにすべきである。
オーバーローディング
CやJavaなどで引数の型などが違うプロトタイプを複数宣言して、渡す引数によって処理を選択できることを多重定義、オーバーローディングという。
Objective-Cは動的束縛で実行時に引数の型が決定されるため、このような多重定義は行えない。
代わりに、以下のようにメッセージセレクタ(ラベル)の違いによりオーバーロードが可能であるとも言える。
- (int) test1;
- (int) test1: (int) a1;
- (int) test1: (int) a1 arg2: (int) a2;

@class クラスの前方前言

ヘッダー内で、特定のクラスの型を使いたい場合、そのクラスのヘッダーファイルを読み込むと再帰的に読み込みが起きたりするため、代わりに@classディレクティブでクラス名の使用を宣言します。
@class Volume;
という感じでVolumeというクラスを使うことを宣言できます。これをクラス名の前方宣言という。
(実装部では使用するクラスのヘッダーファイルが必要になるかもしれないが)

インスタンス変数の隠蔽

Objective-Cでは基本的にオブジェクトの外からインスタンス変数にアクセスすることを許可しません。
アクセサ
インスタンス変数には直接アクセスしないで、アクセサというgetter/setterを通してアクセスするのが普通です。

クラスオブジェクト

クラスオブジェクトはオブジェクトして機能するために、それ独自の変数やメソッドをもっています。
インスタンス変数 <-> クラス変数
インスタンスメソッド <-> クラスメソッド、ファクトリーメソッド
クラスメソッドはファクトリーメソッドとも言われることがあり、allocなどが典型的な例です。
クラス変数
Objective-Cはクラス変数が構造上ありませんが、static指定子を使い変数を宣言したものをクラス変数の代用とすることもできる。
Objective-Cのクラス変数は基本的に外部に公開してつかうものではない。

イニシャライザを返す型

Objective-Cではイニシャライザを返す型は一般的にidがたにしておくべき。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/0129/tb/