ターゲット/アクションパラダイム

頭が混乱した状態のまま書いてます。。。

今回注目するのは、メニュー選択時の動作の設定方法である。Cocoaでは、ここでターゲットとアクションという考え方を使う。ターゲットとはメニューの処理を行う対象、アクションは実際に行う処理の内容である。つまり、ターゲットとはオブジェクト、アクションとはセレクタ(メソッドの名前)ということになる。

(略)

まず、オブジェクトがターゲットとなるために必要な条件は何か。実は、何も無い。特定のクラスを継承したり、特定のメソッドを実装したりする必要はない。Objective-Cのオブジェクトでさえあれば、メニューのターゲットとなる。

そして、もう1つのポイントはアクションの定義方法である。アクションはセレクタ、つまりメソッドの名前で指定する。Interface Builderは、クラスの実装ファイルとは独立して動かすことができるので、実はまだ存在しないメソッドも指定することができる。

http://journal.mycom.co.jp/column/objc/004/index.html

ユーザがマウスを操作して、メニューを選択してコマンドを送る。この動作をCocoaプログラミングの観点から語ると、メニューに設定されているターゲットの、指定されたアクションを呼び出す、ということになる。

ただし、必ずしもターゲットがアクションに対応するメソッドを実装しているとは限らないことに注意してほしい。ターゲットとアクションの指定は、その実装となんら関係なく行われる。コンパイルの時点ではチェックされず、実際に動作させて、メニューを選択しようとするときに確認が行われる。

この確認で使われるのが、オブジェクトのメソッドの実装状況を調べる、respondsToSelector:メソッドである。このメソッドを使って、ターゲットがアクションに対応するメソッドを持つかどうかチェックする。実装されているなら、アクションを呼び出すために、performSelector:withObject:というメソッドを使う。

http://journal.mycom.co.jp/column/objc/005/index.html

むむむ。JavaのJButton#addActionListener的なものをInterface Builderのドラッグアンドドロップ操作で実現しソースコード上には表現されない上にここまで動的にやるのか。

ターゲット(JavaでいうActionListenerの実装クラス?)とアクション(JavaでいうactionPerformedメソッド?)になんの制限も無い。

JavaでもAOPチックにやればActionListenerの実装クラスを動的に変えられると思うが、ActionListener自体は必要なはず。Objective-Cではそういった制限すら無いのか。