Objective-C 2.0プログラミング言語: クラス
公開日:
:
最終更新日:2012/12/14
Objective-C
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
以下のドキュメントを読んでいる。
コンパイラにより、クラスごとに1つだけアクセス可能なオブジェクトが作成されます。これがクラスオブジェクトで、そのクラスに属する新しいオブジェクトの構築方法を知っています(そのため、伝統的に「ファクトリオブジェクト」と呼ばれています)。
ここら辺も、Rubyと同じような感じだなあ。
404 Page not found @ val it: α → α = fun
規則により、クラス名は大文字で始まり(「Rectangle」など)、インスタンス名は通常小文字で始まります(「myRect」など)。
継承
Foundationフレームワークをベースにしたコードを書いている場合、そのルートクラスは一般的にNSObjectです。
作成するすべてのクラスは、(新しいルートクラスを定義しないかぎり)別のクラスのサブクラスである必要があります。
NSObjectクラス
NSObjectはルートクラスなので、スーパークラスはありません。Objective-Cオブジェクトとオブジェクトの対話の基本的フレームワークは、NSObjectで定義されています。
特別な動作を別のクラスから継承する必要のないクラスでも、NSObjectクラスのサブクラスにするべきです。
Rubyって、ここら辺に関しては選択の余地はないんだっけ??
インスタンス変数の継承
NSObjectクラスで定義された isaインスタンス変数は、あらゆるオブジェクトの一部になります。
ここら辺についてはC++とかと同じみたい。
メソッドの継承
クラスオブジェクトも、階層で上位にあるクラスを継承します。ただし、クラスオブジェクトはインスタンス変数を持たないため(インスタンスだけが持ちます)、メソッドだけを継承します。
メソッドのオーバーライド
メソッドをオーバーライドするとオリジナルを継承できなくなりますが、新しいクラスで定義された他のメソッドは、再定義されたメソッドをスキップして、オリジナルを見つけることができます
また、再定義したメソッドには、オーバーライド対象メソッドを組み込むことができます。この場合、新しいメソッドはオーバーライド対象メソッドを完全に置き換えるのではなく、改良または変更するにすぎません。
ここら辺も、C++/Javaあたりと同じようだ。
抽象クラス
NSObjectクラスは抽象クラスの典型的な例です。プログラムは多くの場合、NSObjectのサブクラスを定義して、そのサブクラスに属するインスタンスを使用しますが、NSObjectクラスに直接属するインスタンスを使用することはありません。
クラスの型
sizeof演算子の引数などのように、C言語において型指定子を指定できる場所ならば、クラス名をソースコードに記述できます。
int i = sizeof(Rectangle);
静的な型定義
idの代わりにクラス名を使用して、オブジェクトの型を指定することができます。
Rectangle *myRect;
静的な型定義はポインタを明示的なものにし、idはポインタを隠蔽します。
C++と同様に、以下のような記述も可能みたい。
Graphic *myRect;
型のイントロスペクション
isMemberOfClass:メソッドはNSObjectクラスで定義されており、レシーバが特定のクラスのインスタンスかどうかをチェックします。
if ( [anObject isMemberOfClass:someClass] )
...
isKindOfClass:メソッドもNSObjectクラスで定義されており、レシーバが特定のクラスを継承しているどうか、すなわちそのクラスのメンバかどうか(指定のクラスがレシーバに継承パスにあるかどうか)をチェックします。
if ( [anObject isKindOfClass:someClass] )
...
今日はここまで。続きはまた今度。