プログラマー歴20年の管理人が、これらの悩みを解決できるように、手を動かしながらOOPの継承とポリモーフィズムを学べるように記事を書きました!
このブログを読むことで、親クラスと子クラスの関係を理解し、メソッドのオーバーライドの具体的な使い方を学びます。
ポリモーフィズムの基本的な概念と実装方法を理解することができます。これにより、OOPの強力な機能をプロジェクトで活用できるようになります。
この記事を読み終えた後、このコードを理解し、実践的なスキルが身についているはずです。
<?php
// 親クラス(スーパークラス)
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function makeSound() {
return "Some generic sound";
}
}
// 子クラス(サブクラス)
class Dog extends Animal {
public function makeSound() {
return "Woof!";
}
}
// 別の子クラス
class Cat extends Animal {
public function makeSound() {
return "Meow!";
}
}
// ポリモーフィズム学習用の関数
function describeAnimal(Animal $animal) {
echo $animal->name . " says " . $animal->makeSound() . "\n";
}
// オブジェクトの作成とポリモーフィズムのデモ
$dog = new Dog("Buddy");
$cat = new Cat("Whiskers");
describeAnimal($dog); // 出力: Buddy says Woof!
describeAnimal($cat); // 出力: Whiskers says Meow!
// クラスのさらなる例
class Bird extends Animal {
public function makeSound() {
return "Tweet!";
}
}
$bird = new Bird("Tweety");
describeAnimal($bird); // 出力: Tweety says Tweet!
?>
継承とポリモーフィズムの基本を理解し、実際のプロジェクトでこれらの概念を活用する自信が得られます。より柔軟で再利用可能なコードを書くことができ、プログラミングスキルが向上します。
クラスやオブジェクトがあやふやな方は前回の記事をチェックしましょう!
継承(inheritance)は、親クラス(スーパークラス)のプロパティやメソッドを子クラス(サブクラス)に引き継ぐことを指します。
継承を使うことで、共通の機能を持つクラスを効率的に作成し、コードの再利用性を高め、保守性を向上させることができます。
理由1️⃣:共通の機能やプロパティを親クラスにまとめておけば、子クラスはその共通部分を再利用できます。これにより、コードの重複を減らすことができます。
理由2️⃣:共通部分を親クラスにまとめることで、変更や修正を一箇所で行うことができ、メンテナンスが容易になります。
理由3️⃣:親クラスを基にして子クラスを作成することで、新しいクラスを簡単に作成し、機能を拡張できます。これにより、柔軟にプログラムを拡張していくことができます。
理由4️⃣:ポリモーフィズムを利用することで、同じインターフェースで異なるクラスのオブジェクトを扱うことができます。これにより、コードの柔軟性が高まり、さまざまなクラスのオブジェクトを同じように扱うことができます
親クラス(スーパークラス)は、他のクラスが継承するための基本的なクラスです。このクラスには共通の特性や機能(プロパティやメソッド)が定義されています。
動物を表す親クラス Animal
を書いてみましょう。
<?php
class Animal {
public $name; //動物の名前プロパティ
// コンストラクタ
public function __construct($name) {
$this->name = $name;
}
// 鳴き声メソッド
public function makeSound() {
return "Some generic sound";
}
}
?>
子クラス(サブクラス)は、親クラスを継承して、その特性や機能を受け継ぎ、さらに自分自身の特性や機能を追加したり、親クラスのメソッドを上書き(オーバーライド)したりします。
Dog
クラスと Cat
クラスは、Animal
クラスを継承した子クラスを書いてみましょう。
<?php
class Animal {
public $name; //動物の名前プロパティ
// コンストラクタ
public function __construct($name) {
$this->name = $name;
}
// 鳴き声メソッド
public function makeSound() {
return "Some generic sound";
}
}
class Dog extends Animal {
// 犬の鳴き声でオーバーライド
public function makeSound() {
return "Woof!";
}
}
class Cat extends Animal {
// 猫の鳴き声でオーバーライド
public function makeSound() {
return "Meow!";
}
}
?>
子クラスは親クラスのプロパティやメソッドを継承します。Dog
クラスと Cat
クラスは name
プロパティと makeSound
メソッドを Animal
クラスから継承しています。
メソッドのオーバーライドとは、親クラスで定義されたメソッドを子クラスで再定義し、異なる動作を提供することです。子クラスは親クラスから継承したメソッドの実装を変更できます。
同じ makeSound
メソッドを使っていますが、犬が「Woof!」と鳴き、猫は「Meow!」と鳴くように書いてます。
<?php
class Animal {
public $name; //動物の名前プロパティ
// コンストラクタ
public function __construct($name) {
$this->name = $name;
}
// 鳴き声メソッド
public function makeSound() {
return "Some generic sound";
}
}
class Dog extends Animal {
// 犬の鳴き声でオーバーライド
public function makeSound() {
return "Woof!";
}
}
class Cat extends Animal {
// 猫の鳴き声でオーバーライド
public function makeSound() {
return "Meow!";
}
}
$dog = new Dog("Buddy");
echo $dog->makeSound(); // 出力: Woof!
$cat = new Cat("Whiskers");
echo $cat->makeSound(); // 出力: Meow!
?>
ポリモーフィズム(多態性)は、「同じメソッドを使って異なる動作をすることができる」仕組みです。
次のコードを書いてみましょう。
<?php
// 親クラス(スーパークラス)
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
// 共通のメソッド
public function makeSound() {
return "Some generic sound";
}
}
// 子クラス(サブクラス)
class Dog extends Animal {
// メソッドのオーバーライド
public function makeSound() {
return "Woof!";
}
}
class Cat extends Animal {
// メソッドのオーバーライド
public function makeSound() {
return "Meow!";
}
}
// ポリモーフィズムを示す関数
function describeAnimal(Animal $animal) {
echo $animal->name . " says " . $animal->makeSound() . "\n";
}
// オブジェクトの作成
$dog = new Dog("Buddy");
$cat = new Cat("Whiskers");
describeAnimal($dog); // 出力: Buddy says Woof!
describeAnimal($cat); // 出力: Whiskers says Meow!
?>
describeAnimal
関数は、Animal
クラス型の引数を受け取り、渡されたオブジェクトの makeSound
メソッドを呼び出し、その鳴き声を表示します。
Animal
クラスを継承した異なるクラス(Dog
や Cat
)のオブジェクトを同じ方法で操作します。新しい動物クラスを追加しても、describeAnimal
関数を変更する必要がありません。
ポリモーフィズムを使うと、同じメソッドを使って異なる動作をさせることができます。異なるクラスのオブジェクトを同じ方法で操作でき、コードの柔軟性と再利用性が向上します。新しいクラスを追加しても、既存のコードを変更する必要がなく、拡張性の高いプログラムを作成することができます。
親クラスと子クラスの関係、メソッドのオーバーライド、そしてポリモーフィズムの基本概念を解説しました。
継承を実装することでコードの重複を減らし、メンテナンスを容易にする。
子クラスで親クラスのメソッドを再定義し、異なる動作を提供する。
同じメソッドを使って異なるクラスが異なる動作をする仕組み。異なるクラスのオブジェクトを同じ方法で扱え、コードの柔軟性と再利用性が向上。新しいクラスを追加しても既存のコードを変更する必要がない。