クラスには静的なプロパティとインスタンスプロパティを定義することができます。インスタンスプロパティはその名のとおりインスタンス毎に存在するプロパティですが、静的プロパティはインスタンスと関連付けられることは無く、代わりにクラスに一つだけ存在するクラスオブジェクトと結び付けられます。
静的変数
変数を宣言する際 static をつけると静的変数の宣言になります。
public static var myStaticVar:int;
静的変数はそれを宣言しているクラスまたはそのサブクラスからは直接参照することができます。
public class BaseClass { public static var myStaticVar:int; // クラス内で宣言されている静的変数にアクセス public function myBaseFunc():Void { myStaticVar = 0; } } public class ChildClass extends BaseClass { // 親クラスの静的変数にアクセス public function myChildFunc():Void { myStaticVar = 1; } }
しかし、静的変数は継承されません。従って外部のクラスからは宣言されているクラスオブジェクトを通じてのみアクセスすることができます。
trace(BaseClass.myStaticVar); // OK trace(ChildClass.myStaticVar); // NG
継承されないということは、サブクラスに同じ名前で異なる型の静的変数を定義するのも可能ということです(クラスを使う側はちょっと混乱しそうですが)。また、静的変数と同名のインスタンス変数を定義することもできます。ますます混乱しそうなので、この辺りの説明は省略することにします。
静的関数
関数宣言時に static をつけると静的関数の宣言になります。
public static function myStaticFunction():Void;
もう何回も書いているのでそろそろしつこくなってきた感もありますが、関数もオブジェクトですから上記のセクションでの説明がそのまま当てはまります。補足しておきたい点は、
- 静的関数内からは静的に宣言されたプロパティしか参照することができません。
- 静的関数は継承されないので、サブクラスで同名の関数を宣言する場合でも override はつけません。シグニチャが一致する必要もありません。(むしろ関数である必要もありません)
コメントする