メソッドオーバーライド再確認
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 33/91。
継承の章では、すでにメソッドのオーバーライドについて学びました。ここでは、それがオブジェクト指向プログラミングにおける最も強力な概念の一つであるポリモーフィズムとどのように関係するのかを見ていきましょう。
ポリモーフィズムとは「多くの形」を意味します。子クラスで method をオーバーライドすると、同じ名前を保ちながら、その method に異なる形を与えることになります。魔法が起こるのは、オブジェクトをその parent 型を通して扱うときです。
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
出力:
Woof!
Meow!関数 makeAnimalSpeak() は任意の Animal を accepts。Dog を受け取るのか Cat を受け取るのかを知ることも気にすることもありません。PHP は実行時に、実際のオブジェクトの型に基づいて正しいオーバーライドされた method を自動的に呼び出します。
これがポリモーフィズムの実例です。
このアプローチを使うと、具体的な型を知らなくても、関連するオブジェクトのファミリーで動作する柔軟なコードを書けます。後から新しい animal クラスを追加しても、function はそれらとも自動的に動作します。
重要なポイント: メソッドのオーバーライドによりポリモーフィズムが実現します。これは、実行時の実際のオブジェクトの型に応じて、異なるクラスが同じメソッド呼び出しに異なる方法で応答できるようにするものです。
チャレンジ
簡単method overriding を通じてポリモーフィズムを示す楽器システムを作りましょう。基底となる Instrument class と、それぞれ独自の音を出す2つの子 class を作成し、単一の function を使って任意の楽器をポリモーフィックに演奏します。
コードを4つのファイルに分けて整理します。
Instrument.php: 保護された$nameプロパティを持ち、constructor を通じて設定するInstrumentclass を作成します。"[name] makes a sound"を返すplay()method を追加します。これは、子 class が Override する基底の動作です。Guitar.php:Instrumentを extends するGuitarclass を作成します。parent file を Include します。constructor は名前を受け取り、それを parent constructor に渡します。"[name] strums a chord"を返すようにplay()method を Override します。Drum.php:Instrumentを extends するDrumclass を作成します。parent file を Include します。constructor は名前を受け取り、それを parent constructor に渡します。"[name] beats a rhythm"を返すようにplay()method を Override します。main.php: Guitar と Drum の両方の file を Include します。performWithという名前の function を作成します。この function はInstrumentparameter(型指定あり)を受け取り、その parameter に対してplay()を calling した結果を返します。この function はポリモーフィズムを示します。parent class の型指定を通じて、任意の instrument type で動作します。
2つの入力を受け取ります。guitar の名前と drum の名前です。これらの名前で Guitar と Drum を作成します。それぞれを performWith() function に渡し、結果を出力します。guitar を first に、次に drum を出力し、それぞれを独自の行に表示します。
performWith() が任意の Instrument を accepts するにもかかわらず、PHP が runtime に実際の object type に基づいて正しい Override 済みの play() method を自動的に calling することに注目してください。これが実際のポリモーフィズムです。
自分で試してみよう
<?php
// 楽器のファイルをインクルードする
require_once 'Guitar.php';
require_once 'Drum.php';
// 入力を読み取る
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: performWith という関数を作成する:
// - Instrument パラメータを受け取る(型ヒントを使用: Instrument $instrument)
// - その楽器で play() を呼び出した結果を返す
// TODO: $guitarName で Guitar を、$drumName で Drum を作成する
// TODO: それぞれを performWith() に渡し、結果を出力する(ギターが先、次にドラム)
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ