空白のサブクラスを作成してスーパークラスを拡張すると、親クラスに同じインターフェイス(同じ実装)を提供する新しいクラスが作成されます。
つまり、親クラスにメソッドが含まれている場合doSomething
、サブクラスは実際にそれを記述しなくても、doSomething
メソッドも使用できるようになります。これに対する1つの注意点は、メソッドがマークさprivate
れている場合です。この場合、継承クラスであるSubClassはアクセスできません。
package {
public class SuperClass {
public function SuperClass():void {
self.doSomething();
}
public function doSomething():void {
trace("doing something");
}
}
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
}
}
この関係を確立したらdoSomething
、SubClassのインスタンスの呼び出しが、SuperClassで定義されているデフォルトの実装とは異なる動作をするかどうかを決定できます。同じ動作が必要な場合は、そのままにしておきます。別の動作が必要な場合は、キーワードを使用して親クラスのメソッドをオーバーライドしますoverride
。
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("doing another thing instead");
}
}
}
doSomething
これで、SubClassのインスタンスを呼び出すものは、変更された動作を取得します。ただし、デフォルトの実装には変更が加えられていません。SuperClassのインスタンス化は、このメソッドのオーバーライドによって変更されません。サブクラスのインスタンスのみが影響を受けます。
これは、プロパティの場合と同じです。
これには1つの例外があり、それは静的プロパティです。静的プロパティは、クラスのインスタンスではなく、クラスのプロパティです。静的プロパティは継承されません。静的プロパティは次のようになります。
package {
public class SuperClass {
public static var i:int = 0;
public function SuperClass():void {
}
public function doSomething():void {
trace("doing something");
}
}
SubClassクラスには、静的プロパティiへの参照はありません。ただし、SubClassインスタンスは、SuperClassの静的な値を変更できます。例として:
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("changing something in SuperClass");
SuperClass.i = 1;
}
}
}
現在、SuperClassの静的変数i
の値は0ではなく1です。このように、SubClassには、SuperClassのプロパティを変更する可能性があります(ただし、コードが適切なアクセス権を持っている場合と同じ可能性があります)。
これがお役に立てば幸いです。