メソッドの定義は、
- クラス定義の中、インスタンス変数の宣言の後に書くこと、と
- ":m"で始めて";m"で終わること、
の二つを除けば、普通のワードの定義と変わりはありません。メソッドですから
インスタンス変数には自由にアクセスできます。宣言された
インスタンス変数名に対して、メッセージを送ってください。
メソッドのなかで、自分自身にメッセージを送るときには、SELFをメッセージの受け手にします。
Message: SELF
これはEarly Bindになります。自分か上位クラスで既に定義されているメソッドがバインドされます。
自分自身に送るメッセージをLate Bindにするには、[SELF]をメッセージの受け手とすることもできます。
Message: [SELF]
一般的なLate Bindの方法にしたがって、[ ]の中にSELFと書き込んでもかまいません(つまり、両脇の括弧との間に半角空白をいれてもよい)。上の方法は、一種の短縮形といえます。
自分自身へのメッセージをLate Bindにする意義は、そのメソッドをもっと後になってから定義できるということで、例えば、サブクラスでそのメソッドを定義すれば、サブクラスのオブジェクトからこのバインドを含むメソッドが起動されたときには、そのサブクラスのメソッドにバインドされることになるわけです。
上の話からも分かるように、SELFは、メソッドの中で単独に使うと、そのオブジェクトのベースアドレスをスタックに積みます。ですから、これをパラメターとして与えて"class_as>"形式でバインドすることもできます。ただ、ベースアドレスを取るにはもう一つ方法があります。それは、"^BASE"というワードを使うことです。このワードは、カレントオブジェクト、つまり、現在、メソッドが起動されている当のオブジェクトのベースアドレスを返します。ベースアドレスがパラメタとして与えられると考えるのであれば、セマンティクスとしては"^BASE"を使う方が理にかなっているように思われます。なお、この"^BASE"はメソッドの外でも使うことができます。これを使ったワードを定義しておけば、メソッドから呼び出すことによって、現行のオブジェクトへの操作を実現できます。
上位クラスのメソッドにバインドしたいときには、"SUPER"をメッセージの受け手にします。
Message: SUPER
このようにすれば、直近上位のクラスから検索を始め、最初に発見された対応するメソッドがバインドされます。
この検索の順位を破って特定のクラスのメソッドに強制的にバインドしたいときには、ベースアドレスをパラメタにして"class_as>"方式でバインドします。
関連項目:
最終更新:2020年01月07日 23:48