インタフェースと違い、抽象クラスの抽象メソッドは、サブクラスでそれを実装していなくともコンパイルエラーとならない。そもそも ActionScript に抽象メソッドという概念が無いため仕方がないと思っていたが、万が一の実装洩れを防ぐための解決策があった (AAS3WDP の Chapter 12 より)。
抽象メソッド内でエラーを投げる
抽象メソッド内を空にせず、エラーを投げるコードを書くことで、サブクラスの同一メソッドが存在しない場合に抽象メソッドが実行され (エラーが投げられ)、コンパイル時に判明する。例えば、動物抽象クラスを定義し、そのサブクラス「犬」があるとする。そして、cry() というメソッドをサブクラスで実装すべきなのに、忘れている場合を想定。
class AbstractAnimal { private function AbstractAnimal() { //コンストラクタ } public function cry():Void { throw new Error("AbstractAnimal.cry() は抽象メソッドです。オーバーライドして下さい。"); } }
import AbstractAnimal; class Dog extends AbstractAnimal { public function Dog() { //コンストラクタ } //cry() を実装し忘れている }
テストスクリプトで Dog クラスのインスタンスを作り、cry() メソッドを呼び出す。
import Dog; var d:Dog = new Dog(); d.cry();//出力にエラーが表示される trace("success");//この trace は実行されない
コンパイルは成功するが、Dog クラスに cry() メソッドが実装されていないため、抽象クラスのエラーが投げられる。エラーをキャッチすれば別だが、上記のような場合では、以後のスクリプトは実行されない。