OSAX命令の上書き

メッセージの経路

 AppleScriptはオブジェクト指向の御多分にもれず、イベント駆動(event driven)型の言語ですから、メッセージがハンドラに送られて、ハンドラに記述されている処理が実行されます。
 同じメッセージを受け取るハンドラが、複数のオブジェクトに用意されている場合、実行されるハンドラの優先順位が決まっていないと、スムーズに実行できません。
 で、このお伺いをたてる道順をメッセージの経路(path)とも言います。

ハンドラのオーバーライド

 利用者定義命令も、履歴ウィンドウには表示されませんが、基本的にはメッセージを発信して、それをハンドラが受け取って実行していると考えられます。
 さて、次のスクリプトを見て下さい。

beep

on beep
end beep

 beep命令が書かれていますが、実行してみると何もおきません。
 これは、beepハンドラを置く事で、メッセージを横取りしているために起こります。
 OSAXよりもスクリプトのハンドラの方が優先順位が高いので、メッセージがbeep命令より先にbeepハンドラに届いているのです。

continueする

 メッセージを横取りしたハンドラの方にcontinue beepと書いて、メッセージを先に送るようにすれば、ちやんとbeep命令が実行されます。

beep

on beep
	continue beep
end beep

 この仕組みを使えば、手軽にOSAX命令を拡張する事もできます。
 continue する前後に処理を追加しておけばいい訳です。
 もちろん、continueしなければ、全く別の処理を行うこともできます。
 次の

beep

on beep
	display dialog "ビープ" buttons {"OK"}
	continue beep
end beep

他の命令は?

 AppleScript命令はメッセージが発生せず、いきなり実行されるので高速です。ハンドラを利用して乗っ取る事もできません。
 また、アプリケーション命令はメッセージの送り先がハッキリしていないと実行されないので、通常は乗っ取る事はできません。ただし、parentとして設定している場合は乗っ取ることができます。
 親(parent)のスクリプトオブジェクトの利用者定義命令は乗っ取れます。特に、親のオブジェクトの定義を重ねることを、オブジェクト指向の用語ではオーバーライド(override:優先)と言います。単なるウンチクですから、覚える必要は無いですが。
 このあたりのことは、別Tipで書くかもしれません。


2002-01-08