オーバーライドは継承関係のあるクラスがあるときに、サブクラス側でスーパークラスのメソッドを再定義する機能でした。
オーバーライドは継承ありきの機能ですから、継承自体の理解を深めることが重要です。
※理解しずらい場合は、継承やオーバーライドの文法を優先して覚えるのもいいと思います。
※この記事は補足記事なので、飛ばしてもこの後の学習はできます。
継承のイメージ
継承を利用すると、スーパークラス側のメソッドがサブクラス側でも利用できます。
継承関係は、スーパークラスとサブクラスを合体されて一緒になるというイメージがあると思います。(たぶん)
継承関係はスーパークラスとサブクラスが一緒になるというよりも、サブクラス内部にスーパークラスがくっつく(合体と一緒?)イメージのほうがより近いと思います。
以下はこの説明を図解にしたものです。
合体の図
サブクラス内部にスーパークラスの図
同じように思うかもしれませんが、上記イメージを軸に説明をしていきます。
オーバーライドの補足
オーバーライドは継承関係があるサブクラス側のメソッドでスーパークラスのメソッドを上書き(再定義)する機能です。
この時の上書きとは、サブクラス側のメソッドでスーパークラスのメソッドを消すということではありませんので、サブクラス側からは、スーパークラスのオーバーライドされたメソッドを、superキーワードを利用してアクセスも可能です。(オーバーライドの記事参照)
ですが、他クラスからオーバーライドされたメソッドにアクセスすることはできません。
例えば、以下のようにメソッドが作成されている場合です。
Vehicleクラスでのオーバーライドされたメソッド
1 2 3 4 |
//ハンドル操作のメソッド、引数は角度 void handleOperation(int c){ if(c >= -90 && c <= 90) handle = c; } |
Autobikeクラスでのオーバーライドしたメソッド
1 2 3 4 |
//handleOperation()メソッドのオーバーライド void handleOperation(int c){ if(c >= -45 && c <= 45) super.handleOperation(c); } |
スーパークラスのメソッドでは角度の制限が-90から90となっていますが、サブクラスのメソッドでは-45から45になっています。
他のクラスからVehicleクラスのメソッド(オーバーライドされるメソッド)が利用されてしまうと、Autobikeクラスで設けた条件が利用できなくなってしまうため、設計者の意図しない値が設定されてしまいます。(その値が原因でほかのメソッドも誤動作する可能性があります)
また、メソッドが消えたわけではないので、Autobikeクラスの内部ではスーパークラスであるVehicleクラスのメソッドが問題なく呼び出されていることがわかります。
まとめ
- オーバーライドされたメソッド(スーパークラス側のメソッド)は消えるわけではない
- 他のクラスからはサブクラス側を利用してインスタンスを生成した場合は、オーバーライドされたメソッドはアクセスできない
- サブクラス側からはsuperキーワードを利用してオーバーライドされたメソッドにアクセスできる