カテゴリー : 2013年 8月9日

オーバーライド

スーパークラスで定義したメソッドをサブクラスで上書きすることをオーバーライドと言います。

実際に行ってみましょう。
下記のようにBusinessPersonクラスを継承したEliteBusinessPersonクラスを作成してください。

実行コードは下記のようにしてみましょう。

継承元のBusinessPersonクラスのwork()メソッドはEliteBusinessPersonクラスによって上書きされました。 しかしshow()メソッドは多段階さかのぼり大元のPerosnクラスの者を参照していることが確認できますね。

スーパークラスのメソッドを呼び出す。

スーパークラスの機能を利用しつつ、サブクラス側で独自の機能を追加する場合などにしようしてみましょう。

HetareBusinessPersonクラスを作成します。

BusinessPersonクラスを継承をしています。且つ、BusinessPersonクラスのwork()メソッドをオーバーライドさせているのですが、スーパークラスのwork()メソッドも利用しています。その際にparentキーワードと :: 演算子で メソッドを結んでいます。
実行コードは

で確認をして見ましょう。

スーパークラスのコンストラクタを呼び出す。

スーパークラスのコンストラクタを流用しながらサブクラスのスーパークラスを定義することもできます。

Foreignerクラスを作成します。

実行コードは、

スーパークラスのコンストラクタを利用しつつ、コンストラクタをひとつ追加していますね。その際にparentキーワードと::演算子でスーパークラスのコンストラクタを呼び出しています。

オーバーライドの禁止

各クラスでオーバーライドを禁止して、クラスの不用意な書き換えを予防するのが、final修飾子です。このアクセス修飾子をメソッドを public final function work(){ } のようにメソッドや、final class BusinessPerson{} のようにクラス全体に記述することによって、final修飾子のついた単位でオーバーライドを禁止することができます。

クラスの練習問題3

問題1 次の図は継承を説明したものです。 空欄を埋めなさい。

{ ① }

↑ {  ② }キーワード

{ ③ }

 

問題2
次のようなMyClass があるものとします。 getDataメソッドを継承し、文字列全体を【 】で囲むように変更してみましょう。 尚継承に際しては、parentキーワードも利用するようにしましょう。

ポリモーフィズム

日本語では多様性とかに訳されます。

もう少し具体的にいうと クラスは異なっても同じ名前のメソッドでいろんな動きを実現させる事です。

実際に行ってみます。
スーパークラス Figure コンストラクタのみをもったクラスです。

Figureクラスを継承したサブクラスTriangle 三角形の面積をメソッドgetAreaで計算するクラス

Figureクラスを継承したサブクラスSquer 四角形の面積をTriangleと同じくgetAreaで計算するクラス

実行コード

両方とも同じクラスFigureを継承し、かつgetAreaで処理を行っています。