2012-06-18T19:57:22+09:00
AppleScript のスクリプトオブジェクトの継承と my による property の参照
AppleScript のスクリプトオブジェクトの property のスコープについて、少々講釈をたれるぜ。そして、スクリプトオブジェクトを継承した場合の property へのアクセスについての注意事項を少々。
スクリプトオブジェクトを使いこなして AppleScript でオブジェクト指向している人の生息さえ不確かなんだけど、いつの日か誰かのお役に立つことを願って。
まずは、次のスクリプトを見てください。トップレベルで property msg を宣言しています。そして、スクリプトオブジェクト ProperyAccess の中から、トップレベルの property msg を参照している。
スクリプトオブジェクトは、parent property を指定しないと、そのスクリプトオブジェクトを内包しているスクリプトオブジェクトを自動的に継承する。つまり、PropertyAccess の parent はトップレベルスクリプトになる。
さて、スクリプトオブジェクト PropertyAccess からプロパティ msg にアクセスできる理由は、
のどちらだろう?答えは、1番「変数 msg のスコープにあるから」。その証拠に、次のように PropertyAccess の parent を指定して、トップレベルを継承しないようにしてみる。これでも、トップレベルのプロパティ msg にはアクセスできちゃうぜ。
実は、スクリプトオブジェクトの property にアクセスする為には、その所属先を明示しなければならない。ハンドラの中から所属しているスクリプトオブジェクトにアクセスする為には、my や me といった用語を使う必要がある。
ちなみに、トップレベルを継承していない ProperyAccess の中で、my をつけて変数 msg にアクセスすると、エラーになる。PropertyAccess には msg というプロパティが存在しないからだ。
ほとんどの場合は、my があっても無くても関係ないと思う。スクリプトオブジェクトを継承した場合は my が無いと期待したプロパティを参照しなくなる。
上のスクリプトでは、トップレベルでハンドラを定義している。そして、トップレベルを継承したスクリプトオブジェクトを経由してハンドラを実行している。オブジェクト指向的には、メッセージを送った先のオブジェクトのプロパティが参照されないといけないんだけど、my をつけないとスコープにある変数を参照してしまう。だから・・・・
property にアクセスしたいときは、my を必ずつけるようにした方がいい。
こんな知識が何の役に立つかというと、AppleScript でオブジェクト指向をバリバリ活用する為には必要になる。たとえば、AppleScript でクラスを表現する時には必須になる。
AppleScript のスクリプトオブジェクトでクラスを作ろう
という解説を、昔書いたのでご参照ください。