継承の話題の続きです。
インスタンスメソッドのオーバーライド
継承したクラスのインスタンスメソッドをオーバーライドするには override キーワードを使います。オーバーライドするメソッドは以下の条件を満たす必要があります。
- 同じ名前である
- 同じアクセス修飾子である
- 同じ数の引数を持つ
- 個々の引数の型が同じである
- 戻り値の型が同じである
final キーワード付で宣言されたメソッドはオーバーライドできません。
また、private 属性のクラスと同じ名前のメソッドを定義する場合は override を付けません。親クラスの private なメソッドは「見えない」からです。
public class MyBase { final public function finalFunc():void { } public function publicFunc():void { } private function privateFunc():void { } }
この場合、MyBase クラスの中でオーバーライドできるメソッドは一つだけです。
public class MySub extends MyBase { // final キーワードが付いているためオーバーライドできない override public function finalFunc():void { } // オーバーライド可能 override public function publicFunc():void { } // override を付けずに宣言することは可能 override private function privateFunc():void { } }
super
関数をオーバーロードする際、継承元クラスのメソッドを参照するには super を使います。super.methodName() のような形で使います。
コンストラクタでは super() で親クラスのコンストラクタを参照します。
public class MySub extends MyBase { // コンストラクタ定義 public function MySub() { super(); } // 関数をオーバーロード override public function publicFunc():void { super.publicFunc(); } }
プロパティのオーバーライド
AS3 では属性をオーバーライドをすることができません。
ですが、get や set を使ったプロパティは関数でアクセスするためオーバーライドが可能です。例えば、以下のような定義のクラスがあるとします。
public class MyBase { private var _myProp:String = "myprop"; public function get myProp():String { return _myProp; } public function set myProp(val:String):void { _myProp = val; } }
これを継承したクラスでは以下のような記述をすることができます。
public class MySub extends MyBase { override public function get myProp():String { return super.myProp; } override public function set myProp(val:String):void { super.myProp = val; } }
コメントする