🦁
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";
}
}
Dog は breathe() をそのまま使え、makeSound() は必ず実装しないといけません。
使い分けのポイント
- ルールだけを強制したい → インターフェース
- 共通の処理も持たせたい → 抽象クラス
一覧で比較
| 特徴 | インターフェース | 抽象クラス |
|---|---|---|
| メソッドの中身 | 書けない | 書ける(抽象メソッド以外) |
| プロパティ | 定義不可 | 定義できる |
| 多重継承 | 可能 | 不可 |
| 目的 | 「契約」を定義する | 「共通処理+契約」を定義する |
まとめ
- インターフェース = 「絶対にこれを実装してね」という約束
- 抽象クラス = 「共通処理は持たせるけど、一部は実装任せる」
迷ったらまずは インターフェース、
共通処理をまとめたいなら 抽象クラス を選びましょう。
Discussion