override 修飾子の意味

昔の“常識”,今の“非常識” - 記者の眼:ITpro

加えて,クラス継承には「脆弱な基底クラス」(fragile base class)と呼ばれる問題がある。基底クラスのあるメソッドfが内部で別のメソッドgを呼び出している場合に,派生クラスでgの振る舞いを変更(オーバーライド)するとfの振る舞いまで変わってしまう,というのがその例だ。こうした問題が発生するかどうかは基底クラスにおけるfの実装に依存するため,クラスを継承する際に基底クラスをブラックボックスとして扱うことができない。

AS3 でコードを書いていて時々面倒くさいなと思うことが、派生クラスでメソッドをオーバーライドするときに override 修飾子を付けなければいけないこと。
付け忘れるとコンパイルエラーが出るので、override 修飾子が必要ない Java に慣れていると、なんでわざわざこんな修飾子を付けなければいけないんだろうと疑問だった。

先日 Scala 本を読んでいて、ようやくこの疑問が解決した。Scala でも AS3 と同様、オーバーライドするには override 修飾子を付ける必要があるのだけど、この修飾子は上の記事にも書かれている「脆弱な基底クラス」問題を防ぐためのものだった。つまり、知らないうちに基底クラスの振る舞いを変更(「不測のオーバーライド Accidental Overrides」と言うらしい)してしまわないため、派生クラスで明示的に override 修飾子を付けないとコンパイルエラーになるようにしている。

override 修飾子には重要な意味があったんだね。全然知らなかったよ。
Java には @Override アノテーションがあるけど、今後はこのアノテーションがないとコンパイルエラーになるようにするのかな。

Last updated on July 8, 2015