ActionScript 3.0 には、クラス内で定義されたプロパティへのアクセスを制御する 4 つの特別な属性、public、private、protected、および internal があります。
public 属性は、スクリプト内の任意の場所でプロパティを表示します。例えば、パッケージ外部のコードでメソッドを使用するには、public 属性でメソッドを宣言する必要があります。これは、宣言されたキーワードが var、const、function のいずれであるかにかかわらず、あらゆるプロパティに当てはまります。
private 属性は、プロパティが定義されたクラス内の呼び出し元に対してのみプロパティを表示します。このビヘイビアーは、サブクラスがスーパークラスのプライベートプロパティにアクセスできる ActionScript 2.0 の private 属性とは異なります。ランタイムアクセスに関しても、ビヘイビアーが大きく変更されています。 ActionScript 2.0 では、private キーワードによりアクセスが禁止されるのはコンパイル時のみで、実行時にはアクセスが禁止されません。ActionScript 3.0 では、これは当てはまりません。 private とマークされたプロパティは、コンパイル時も実行時も使用することができません。
例えば、次のコードは、プライベート変数を 1 つ持つ PrivateExample という単純なクラスを作成し、クラス外部からこのプライベート変数にアクセスしようとします。
class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error.
ActionScript 3.0 では、ドット演算子(myExample.privVar)を使用してプライベートプロパティにアクセスしようとすると、strict モードを使用している場合にコンパイル時エラーになります。それ以外の場合は、プロパティアクセス演算子(myExample["privVar"])を使用するときと同様に、エラーは実行時に報告されます。
次の表に、sealed(dynamic ではない)クラスに属するプライベートプロパティにアクセスしようとした結果の概要を示します。
|
strict モード
|
standard モード
|
ドット演算子(.)
|
コンパイル時エラー
|
ランタイムエラー
|
角括弧演算子([])
|
ランタイムエラー
|
ランタイムエラー
|
dynamic 属性で宣言されたクラスでは、プライベート変数にアクセスしようとしても、ランタイムエラーにはなりません。ただし、変数が参照不可になるため、undefined という値が返されます。しかし、strict モードでドット演算子を使用すると、コンパイル時エラーが発生します。 次の例は、PrivateExample クラスがダイナミッククラスとして宣言されている点を除き、前の例と同じです。
dynamic class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // output: undefined
通常、ダイナミッククラスは、クラス外部のコードがプライベートプロパティにアクセスしようとすると、エラーを生成するのではなく、戻り値として undefined を返します。次の表は、ドット演算子を使用して strict モードでプライベートプロパティにアクセスしようとしたときにのみエラーが生成されることを示します。
|
strict モード
|
standard モード
|
ドット演算子(.)
|
コンパイル時エラー
|
undefined
|
角括弧演算子([])
|
undefined
|
undefined
|
ActionScript 3.0 で新しく導入された protected 属性は、クラス内またはサブクラス内の呼び出し元に対してプロパティを表示します。つまり、protected プロパティは、そのクラス内または継承階層内でそのクラスの下の任意の場所にあるクラスで使用することができます。 これは、サブクラスが同じパッケージ内にあるか別のパッケージ内にあるかに関係なく、同じです。
ActionScript 2.0 に詳しいユーザーにとっては、この機能は ActionScript 2.0 の private 属性とほぼ同じです。また、ActionScript 3.0 の protected 属性は Java の protected 属性とほぼ同じですが、Java のこの属性は同じパッケージ内の呼び出し元へのアクセスも許可するという点で異なります。ただし、Java では、この属性は同じパッケージ内の呼び出し元へのアクセスも許可するという点で異なります。protected 属性は、サブクラスで必要なメソッドまたは変数を継承チェーン外部のコードに対して非表示にするときに便利です。
ActionScript 3.0 で新しく導入された internal 属性は、パッケージ内にある呼び出し元に対してプロパティを表示します。これはパッケージ内のコードのデフォルト属性であり、次のいずれの属性も持たないあらゆるプロパティに適用されます。
public
private
protected
ユーザー定義の名前空間
internal 属性は、Java のデフォルトのアクセス制御に似ています。ただし、Java ではこのレベルのアクセスに明示的な名前はなく、他のアクセス修飾子が省略された場合にのみ、このデフォルトのアクセス制御が使用されます。internal 属性は ActionScript 3.0 で使用可能で、パッケージ内の呼び出し元に対してのみプロパティを表示する意図を明示的に表すオプションがあります。