なぜ abstract が要るか

EC サイトには「カード払い」「銀行振込」「コンビニ払い」と複数の決済手段があるが、どれも 「金額を受け取って結果を返す」 枠は揃えたい。親で枠だけ決めて、具体の処理は子に必ず書かせたい。これが abstract の出番。

abstract の書き方

abstract class でクラス自体を抽象に、abstract function中身を書かないメソッド を宣言する。

abstract class PaymentMethod {
    abstract public function charge(int $amount): string;
}

PaymentMethodそのままでは new できない。継承して使う。

子に実装を強制する

抽象メソッドを持つクラスを継承した子は、すべての抽象メソッドを実装しないと自分も abstract のまま になる (= new できずエラー)。

class Card extends PaymentMethod {
    public function charge(int $amount): string {
        return "カードで {$amount} 円を決済しました";
    }
}

charge() の実装漏れを コードを書いた時点で防げる

abstract vs interface

使い分け 抽象クラス インターフェース
共通の実装も親に書きたい ×
契約 (メソッド名) だけ揃えたい
多重継承的に複数の契約を持たせたい ×

共通の処理を親に持たせたいなら abstract、契約だけならインターフェース (次章)。

学習目標

ドリル

no 内容
01 abstract class PaymentMethod を継承した Cardcharge() を実装する

演習: ドリル 01 — abstract PaymentMethod を継承した Card

題材

EC サイトの決済処理。複数の支払い手段を共通の枠で扱うため、親で charge() の存在だけ強制し、具体の処理は子に書かせる。

本番では Stripe / PAY.JP の SDK を呼ぶが、ここでは練習のため文字列で返す。

やること

abstract class PaymentMethod を定義してください。

PaymentMethod を継承した Card クラスを定義してください。

Card をインスタンス化し、charge(1500) の結果を 1 行出力してください。

期待される出力

カードで 1500 円を決済しました

ヒント

この章を AI に聞く

  1. 「ch04 — 抽象クラス (abstract)」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch04 — 抽象クラス (abstract)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch04 — 抽象クラス (abstract)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch04 — 抽象クラス (abstract)」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE