クラスの継承 - Cocoaプログラミング

あなたの使おうとするそのクラス、誰の子どもですか。

てくっち

クラスを設計するとき、1から作るんじゃなくて、既存のクラスの機能を引き継がせることができます。

てくっち

そうすると新しく追加・修正したい部分だけを書けばいいので、らくちんです。

てくっち

このしくみを、継承といいます。

てくっち

Cocoaフレームワークの各クラスにも、継承によって作られたものがたくさんありますよ。

和田

先生のお子さんは本当に先生のお子さんなんですか??

てくっち

和田

先生の持ってる機能はお子さんに本当に継承されているでしょうかねぇ…

てくっち

どうなんすかねえ・・

てくっち

さて実例を・・ボタン(NSButton)について

和田

はい

てくっち

NSButtonは、NSControlを継承しています。

和田

NSControl

和田

コントロールですね

和田

制御

てくっち

ええ。そしてNSControlは、さらにNSViewを継承しています。

和田

ほほう

てくっち

さらにさらに、NSViewはNSResponderから。

てくっち

NSResponderはNSObjectから。

和田

ほほほぅ

てくっち

どんだけ継承すんねん。

和田

ラスボスはどれなんですか

てくっち

NSObjectです。

てくっち

これがすべての祖先ですね。

和田

NSObjectが始祖鳥みたいなものと

てくっち

そうです

てくっち

CocoaのすべてのクラスはNSObjectの子どもたちなんです

てくっち

NSObejctで実装されてるメソッドは、けっこうたくさんあるんですよ

てくっち

それらをすべて引き継いでおるんです

和田

なかなかNSObjectはおさかんなんですね…

てくっち

そうなんです

和田

ヤリまくりじゃないすか

てくっち

そうなんです。自作クラスを作るときもですね、

てくっち

@interface Human : NSObject {
  int age;
  NSString *name;
}

てくっち

などとやりますが。1行目に注目!

てくっち

: NSObject

和田

ほぅ

てくっち

これが、「NSObjectを継承します」という意味です。

和田

つまり婚姻届みたいなもんですね

てくっち

うーん婚姻ではなく、親子ですねー

和田

養子縁組?

てくっち

養子じゃなくて、実の親子ですねーw

和田

てくっち

親子というか、クローンというべきかな。

てくっち

インスタンス変数とメソッドを、そのまま引き継がせる。

てくっち

うーんなんかとりとめがなくなってきましたが!

てくっち

実用上、重要なことを1つ

てくっち

ウインドウ上に、アイコンサイズの小さい画像を表示させるプログラムを書いていたとしましょう。

てくっち

その画像のクラスは、NSView

てくっち

その画像をクリックしたときに、なにか処理をさせたいとしましょう。

和田

ふむふむ

てくっち

NSViewの説明書をいっしょうけんめい読むわけですよ

てくっち

http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

てくっち

でもどこにも「クリックされたら呼ばれるメソッド」がない!

和田

ふむふむ

てくっち

そこで、継承を思い出すわけなんですね

和田

ふむふむ

てくっち

もしかしたら、NSViewの親クラスで定義されてるかもしれないわ!と

てくっち

親クラスのNSResponderを調べると、マウスイベントを受けとるメソッドがわんさかと見つかるわけですよ。

てくっち

というふうに、調べものをするうえでとても大切なんですー。

和田

それはやはり

和田

ネットなどで調べないと駄目なのでしょうか

和田

調べるコマンドがあるとか…ないですよね…

てくっち

さっきのリンクなら、NSViewでググるとすぐ見つかりますし

てくっち

Xcode上なら、オンラインヘルプがありますねー

てくっち

Xcode上で、調べたいクラス名とかの上で、option クリックですね

てくっち

いや、optionダブルクリック

てくっち

こうすると素早くひけますよ

和田

ほほぅ

和田

つまり末端のクラスになればなるほど

和田

なんかいろいろ親や祖父らから大量のメソッドが継承されていると。

てくっち

そうですね

てくっち

まあ必要なときに調べていけば、OKかと

てくっち

そのうちに、NSResponderクラスはマウスやキーボードのイベントを扱うとか、

てくっち

NSControlはターゲットとアクションを持ってるとか、

てくっち

整理されてくると思いますよー。

和田

覚えられる自信がまったく無いぜ…。

てくっち

覚えようとしなくても、自然に整理されますよきっと

和田

先生はちなみになんとなく整理されてますか?

てくっち

ええ、なんとなく。

てくっち

必要なとこだけ、チェックしていく感じです。