🕛 2024.5.18 05:10

【実践】Hands-On で理解するオブジェクト指向プログラミング(OOP) 継承とポリモーフィズム

  • 親クラスと子クラスの関係が理解できない
  • メソッドのオーバーライドがよくわからない
  • ポリモーフィズムの活用方法がわからない

プログラマー歴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!

?>

継承とポリモーフィズムの基本を理解し、実際のプロジェクトでこれらの概念を活用する自信が得られます。より柔軟で再利用可能なコードを書くことができ、プログラミングスキルが向上します。

クラスやオブジェクトがあやふやな方は前回の記事をチェックしましょう!

これから、オブジェクト指向プログラミング(OOP)の継承とポリモーフィズムについて解説します。

それでは、親クラスと子クラスの関係、メソッドのオーバーライド、そしてポリモーフィズムの基本概念と実装方法を学んでいきましょう!

継承とは?

継承(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 クラスを継承した異なるクラス(DogCat)のオブジェクトを同じ方法で操作します。新しい動物クラスを追加しても、describeAnimal 関数を変更する必要がありません。

ポリモーフィズムを使うと、同じメソッドを使って異なる動作をさせることができます。異なるクラスのオブジェクトを同じ方法で操作でき、コードの柔軟性と再利用性が向上します。新しいクラスを追加しても、既存のコードを変更する必要がなく、拡張性の高いプログラムを作成することができます。

まとめ

親クラスと子クラスの関係、メソッドのオーバーライド、そしてポリモーフィズムの基本概念を解説しました。

継承

継承を実装することでコードの重複を減らし、メンテナンスを容易にする。

  • 親クラス: 基本的な特性や機能を定義するクラス。
  • 子クラス: 親クラスを継承し、新しい機能を追加したり変更したりするクラス。

メソッドのオーバーライド

子クラスで親クラスのメソッドを再定義し、異なる動作を提供する。

ポリモーフィズム

同じメソッドを使って異なるクラスが異なる動作をする仕組み。異なるクラスのオブジェクトを同じ方法で扱え、コードの柔軟性と再利用性が向上。新しいクラスを追加しても既存のコードを変更する必要がない。

プロフィール

プログラマー歴20年の管理人がプログラミング、ブロックチェーンなどの話題に書いていきます。>>続く