メンバーとは?
|
オブジェクト指向プログラミングでは、クラスのメンバ(プロパティまたはメソッド)は「インスタンスメンバ」(instance member)か「クラスメンバ」(class member)かのどちらかになります。インスタンスメンバは、クラスのインスタンスごとに作成されます。インスタンスメンバをコンストラクタ関数の外で宣言すると、そのメンバはクラスの'prototypeに定義されます[*1]。それに対して、クラスメンバは、クラスに対して一度だけ作成されます(クラスメンバは、「静的メンバ」(static class"(日本語版: インスタンスメンバー はクラスの各インスタンス用に作成され、各インスタンスにコピーされます)とされています。この表現は、インスタンスメンバが、クラスのオブジェクトインスタンスごとに個別に設定されるように解釈できます。実際、Javaなどの他言語では値がインスタンスごとに設定されるため、思わぬ誤解を生みやすい点です。 コンストラクタの外で'var'宣言されたプロパティは、クラスの'prototype'に定義されます。その値はいわばデフォルト値として、インスタンスの'__proto__'プロパティを通じて参照されます。インスタンス自身にプロパティを設定するには、コンストラクタ中で処理を行う必要があります(「3.3 プロパティのインライン初期化」[訳者註*1]参照)。以下のサンプルスクリプトで、その動作を確認することができます。 インスタンスメソッドを呼出したり、インスタンスプロパティにアクセスするには、クラスのインスタンスを参照します。たとえば、以下のコードは、MovieClipクラスのclip_mcというインスタンスに対して、showInfo()メソッドを呼出しています。 しかし、クラス('static')メンバはクラス自身に定義され、クラスのインスタンスには設定されません。クラスメソッドを呼出したり、クラスプロパティにアクセスするには、クラス名自身を参照し、クラスの特定のインスタンスは指定しません[*2]。 [訳者註*2] クラスのインスタンスからクラスメンバにアクセスすると、コンパイルエラーになります。しかし、クラスのインスタンスメソッドからクラスメンバには、ターゲットの参照なしにアクセスすることが可能です(後述「4.3 たとえば、ActionScriptのMathクラスは、静的なメソッドとプロパティのみから構成されています。Mathクラスのメソッドを実行するには、クラスのインスタンスは作成しません。単に、Mathクラスそれ自身に対してメソッドを呼出します。以下のコードは、Mathクラスの'sqrt()'メソッドを実行します。 インスタンスメンバは、静的メンバを読取ることができます。しかし、書替えることはできません。インスタンスメンバは、'for'や'for..in'ループで列挙する(enumerable)ことはできません。 クラス(静的)メソッドがアクセスできるのは、クラス(静的)プロパティのみで、インスタンスプロパティは参照できません。たとえば、つぎのコードはコンパイルエラーになります。クラスメソッドgetName()が、インスタンス変数nameを参照しているからです[*3]。 この問題を解決するには、メソッドをインスタンスメソッドにするか、変数をクラス変数にします。 [訳者註*3] クラスメソッド内でthis参照を用いた場合も、コンパイルエラーになります。クラスメソッドはクラスそのものに関連づけられているため、特定のインスタンスを参照するthisをもたないからです。 クラス(静的)メンバの使い方のひとつは、クラスとそのインスタンスの状態に関する情報を管理することです。たとえば、特定のクラスから作成されたインスタンスの数を監視したいとします。簡単な方法は、クラスプロパティを使って、新たなインスタンスを作成するたびに数を加算することです。 以下のサンプルでは、Widgetというクラスを作成します。そして、ひとつの静的なインスタンスカウンタを、widgetCountという名前で定義します。クラスの新たなインスタンスを作成するたびに、widgetCountの値は1加算します。そして、widgetCountの現在値は、[出力]パネルに表示されます。 [訳者註*4] 上記スクリプトでは変数値の加算にポストインクリメントを用いているので、ステートメントを1行で書くことも可能です。 変数widgetCountは、'static'として宣言されています。したがって、値0で1度だけ初期化されます。Widgetクラスのコンストラクタ関数が実行されるたびに、widgetCountは1加算されて、作成されたインスタンスの現在の数が表示されます[*5]。 (7) ファイルを保存して、ムービープレビューを実行する([制御] > [ムービープレビュー]) [訳者註*5] Widget.asは、つぎのように定義することも可能です。'static'宣言したメソッドgetCount()が、加わっています。コンストラクタ関数からは、このメソッドをターゲットの参照なしに呼出すことができます。 クラス内からは、クラスメソッドをターゲット参照なしに呼出せます。しかし、インスタンスをターゲットとして、クラスメソッドを呼出そうとすると、コンパイルエラーになります。ターゲットには、クラスを直接指定する必要があります。 クラスメンバは、そのメンバを定義したスーパークラスからサブクラスに継承されます。前のサンプル(「4.3 クラスメンバの使用: シンプルな例」参照)では、クラスプロパティを使って、作成したクラスインスタンスの数を監視しました。Widgetクラスのサブクラスは、つぎのようにして作成することができます。 更新日: 2004年1月24日 Macromediaのドキュメンテーション修正に合わせて該当する本文と訳者註*1を変更 |
[ 139] FN0309006 - インスタンスとクラスのメンバ - Flash : テクニカルノート
[引用サイト] http://www.fumiononaka.com/TechNotes/Flash/FN0309006.html
