カテゴリー : 2013年 8月

クラスの練習問題2

下記の問題を練習サイトに記述をしてください。
 
その1 
 アクセス修飾子の簡単な説明
その2
 アクセサメソッドを介してメンバ変数(プロパティ)にアクセスするメリットは何でしょうか?

継承

継承とは簡単にいうと継承とは、既に存在するあるクラスを元に、それを更に拡張したクラスを作る仕組みです。
継承元となるクラスはスーパークラス。継承の結果できたクラスをサブクラスと言います。

具体例として先ほど作成したPersonクラスと似たようなクラスBusinessPersonを作ってみます。

*require_once dirname(__FILE__).’/Person.php’のdirname(__FILE__)でファイルの絶対パスを通して、インクルードの動作を確実にしています。

実行コードで

このようにして見ましょう。
インスタンスを行っているのは、BusinessPersonクラスのみです。しかし、Pesonクラスのメソッドshow()にもアクセスが可能ですね。サブクラスからはスーパークラスのあれやこれやが参照できるのです。
順番としては、インスタンス化されたクラスの参照先を探し、なければ継承元(スーパークラス)に参照を求めるという動きです。

ちなみに、PHPでは多重継承はみとめていません。

オーバーライド

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

実際に行ってみましょう。
下記のように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で処理を行っています。