🦁

5分でわかるインターフェースと抽象クラス

に公開

オブジェクト指向を学んでいると出てくる 「インターフェース」と「抽象クラス」
似ているようで実は役割が違います。この記事では、両者の違いをシンプルにまとめます。

インターフェースとは

  • 「ルール(契約)」だけを定義するもの
  • 中身(処理)は書けない
  • 実装するクラスに 必ずメソッドを定義させる

PHPの例

interface PaymentGateway {
    public function pay(int $amount): bool;
}

これを実装するクラスは必ず pay() メソッドを定義する必要があります。

class CreditCardPayment implements PaymentGateway {
    public function pay(int $amount): bool {
        echo "クレジットカードで{$amount}円支払い\n";
        return true;
    }
}

抽象クラスとは

  • 共通処理を持ちながら、未実装メソッドも定義できる
  • インターフェースより柔軟
  • ただし 多重継承はできない

PHPの例

abstract class Animal {
    public function breathe() {
        echo "息をしている\n";
    }

    abstract public function makeSound();
}

class Dog extends Animal {
    public function makeSound() {
        echo "ワン!\n";
    }
}

Dogbreathe() をそのまま使え、makeSound() は必ず実装しないといけません。


使い分けのポイント

  • ルールだけを強制したい → インターフェース
  • 共通の処理も持たせたい → 抽象クラス

一覧で比較

特徴 インターフェース 抽象クラス
メソッドの中身 書けない 書ける(抽象メソッド以外)
プロパティ 定義不可 定義できる
多重継承 可能 不可
目的 「契約」を定義する 「共通処理+契約」を定義する

まとめ

  • インターフェース = 「絶対にこれを実装してね」という約束
  • 抽象クラス = 「共通処理は持たせるけど、一部は実装任せる」

迷ったらまずは インターフェース
共通処理をまとめたいなら 抽象クラス を選びましょう。

Discussion