| ActionScript 3.0 のプログラミング > ActionScript プログラミングの概要 > ActionScript のオブジェクト指向プログラミング > クラス > クラスプロパティの属性 | |||
ActionScript オブジェクトモデルの説明では、"プロパティ" という用語は、変数、定数、メソッドなど、クラスのメンバーになるものを示します。しかし、『ActionScript 3.0 リファレンスガイド』では、"プロパティ" は狭い意味で使用され、変数であるか、getter または setter メソッドにより定義されるクラスメンバーのみを意味します。ActionScript 3.0 には、クラスのプロパティと共に使用できる一連の属性があります。次の表に、この属性の一覧を示します。
|
属性 |
定義 |
|---|---|
|
|
同じパッケージ内の参照に対して表示されます。 |
|
|
同じクラス内の参照に対して表示されます。 |
|
|
同じクラスおよび派生クラス内の参照に対して表示されます。 |
|
|
すべての場所にある参照に対して表示されます。 |
|
|
プロパティが、クラスのインスタンスではなくクラスに属することを指定します。 |
|
|
ユーザーが定義するカスタム名前空間の名前です。 |
ActionScript 3.0 には、クラス内で定義されたプロパティへのアクセスを制御する public、private、protected、および internal の 4 つの特別な属性があります。
public 属性は、スクリプト内の任意の場所でプロパティを表示します。たとえば、パッケージ外部のコードでメソッドを使用するには、public 属性でメソッドを宣言する必要があります。これは、var、const、または function キーワードのいずれで宣言されたかに関係なく、どのプロパティについても同じです。
private 属性は、プロパティが定義されたクラス内の呼び出し元に対してのみプロパティを表示します。このビヘイビアは、サブクラスがスーパークラスのプライベートプロパティにアクセスできる ActionScript 2.0 の private 属性とは異なります。ランタイムアクセスに関しても、ビヘイビアが大きく変更されています。ActionScript 2.0 では、private キーワードによりアクセスが禁止されるのはコンパイル時のみで、実行時にはアクセスが禁止されません。ActionScript 3.0 では、これは当てはまりません。private とマークされたプロパティは、コンパイル時も実行時も使用することができません。
たとえば、次のコードは、プライベート変数を 1 つ持つ PrivateExample という単純なクラスを作成し、クラス外部からこのプライベート変数にアクセスしようとします。ActionScript 2.0 では、コンパイル時アクセスは禁止されていましたが、コンパイル時ではなく実行時にプロパティルックアップを実行するプロパティアクセス演算子 ([]) を使用することでアクセスすることができました。
class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar); // strict モードではコンパイル時エラー
trace(myExample["privVar"]); // ActionScript 2.0 ではアクセスを許可するが、ActionScript 3.0 ではこれはラインタイムエラー。
ActionScript 3.0 では、ドット演算子 (myExample.privVar) を使用してプライベートプロパティにアクセスしようとすると、strict モードを使用している場合にコンパイル時エラーになります。それ以外の場合は、プロパティアクセス演算子 (myExample["privVar"]) を使用するときと同じように、エラーは実行時に報告されます。
次の表に、sealed (dynamic ではない) クラスに属するプライベートプロパティにアクセスしようとした結果の概要を示します。
|
strict モード |
standard モード |
|
|---|---|---|
|
ドット演算子 (.) |
コンパイル時エラー |
ランタイムエラー |
|
角括弧演算子 ([]) |
ランタイムエラー |
ランタイムエラー |
dynamic 属性で宣言されたクラスでは、プライベート変数にアクセスしようとしても、ランタイムエラーにはなりません。変数は表示されないだけなので、Flash Player は戻り値として undefined を返します。しかし、strict モードでドット演算子を使用すると、コンパイル時エラーが発生します。次の例は、PrivateExample クラスがダイナミッククラスとして宣言されている点を除いて、前の例と同じです。
dynamic class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar); // strict モードではコンパイル時エラー
trace(myExample["privVar"]); // 出力 : 未定義
ダイナミッククラスは通常、クラス外部のコードがプライベートプロパティにアクセスしようとすると、エラーを生成するのではなく、戻り値として undefined を返します。次の表は、ドット演算子を使用して strict モードでプライベートプロパティにアクセスしようとしたときにのみエラーが生成されることを示します。
|
strict モード |
standard モード |
|
|---|---|---|
|
ドット演算子 ( |
コンパイル時エラー |
|
|
角括弧演算子 ( |
|
|
ActionScript 3.0 で新しく導入された protected 属性は、クラス内またはサブクラス内の呼び出し元に対してプロパティを表示します。つまり、protected プロパティは、そのクラス内または継承階層内でそのクラスの下の任意の場所にあるクラスで使用することができます。これは、サブクラスが同じパッケージ内にあるか別のパッケージ内にあるかに関係なく、同じです。
ActionScript 2.0 を使い慣れていれば、この機能が ActionScript 2.0 の private 属性に似ていることがわかります。ActionScript 3.0 の protected 属性は Java の protected 属性にも似ていますが、Java の属性でも同じパッケージ内の呼び出し元にアクセスできる点で異なります。protected 属性は、サブクラスで必要なメソッドまたは変数を継承チェーン外部のコードに対して非表示にするときに便利です。
ActionScript 3.0 で新しく導入された internal 属性は、パッケージ内にある呼び出し元に対してプロパティを表示します。これはパッケージ内にあるコードのデフォルトの属性であり、次のいずれの属性も持たないプロパティに適用されます。
publicprivate protectedinternal 属性は、Java のデフォルトのアクセス制御に似ています。ただし、Java ではこのレベルのアクセスに明示的な名前はなく、他のアクセス修飾子が省略された場合にのみこのデフォルトのアクセス制御が使用されます。internal 属性は ActionScript 3.0 で使用可能で、パッケージ内の呼び出し元に対してのみプロパティを表示する意図を明示的に表すオプションがあります。
static 属性は、var、const、または function キーワードで宣言されたプロパティと共に使用でき、クラスのインスタンスではなくクラスにプロパティを関連付けることができます。クラス外部にあるコードは、インスタンス名ではなくクラス名を使用して静的プロパティを呼び出す必要があります。
静的プロパティはサブクラスに継承されませんが、サブクラスのスコープチェーンの一部です。つまり、サブクラスの本体内では、静的変数またはメソッドは、定義されたクラスを参照しなくても使用できます。詳細については、継承されない静的プロパティを参照してください。
事前に定義されているアクセス制御属性の代わりに、属性として使用するカスタム名前空間を作成できます。1 つの定義に使用できる名前空間属性は 1 つだけです。また、名前空間属性をアクセス制御属性 (public、private、protected、internal) のいずれかと組み合わせて使用することはできません。名前空間を使用する方法の詳細については、名前空間を参照してください。
Flex 2.01