【1日45分×6日でわかる】オブジェクト指向 Day6: インターフェースと抽象クラス

オブジェクト指向の最終日は、設計をより柔軟にする「インターフェース」と「抽象クラス」です。どちらも「中身が未完成のメソッド」を扱う点が似ていて、初心者が混同しやすいところです。今日は45分で、両者の役割と違いを理解し、使い分けられるようになります。時間配分の目安は、説明12分、実践25分、振り返り8分です。

インターフェースと抽象クラス(目安12分・インプット)

抽象クラスとは、共通の土台を提供しつつ、一部を「中身なし(abstract)」にして子クラスに実装を任せるクラスです。単独ではインスタンス化できず、`extends` で継承します。

public abstract class Shape {
    abstract double area();   // 中身は子クラスで書く
}

public class Circle extends Shape {
    double r;
    Circle(double r) { this.r = r; }
    double area() { return 3.14 * r * r; }
}

一方インターフェースは、「このクラスはこれができる」という能力の約束事の一覧です。`implements` で実装し、1つのクラスが複数のインターフェースを実装できます。

public interface Flyable {
    void fly();   // 実装は各クラスで
}

public class Bird implements Flyable {
    public void fly() {
        System.out.println("羽ばたいて飛ぶ");
    }
}

両者の違いを図で整理します。

【1日45分×6日でわかる】オブジェクト指向 Day6: インターフェースと抽象クラス

【実践】図形と「飛べる」能力を作る(目安25分・手を動かす)

上の `Shape.java` / `Circle.java` / `Flyable.java` / `Bird.java` に加え、`Main.java` を作って実行しましょう。

public class Main {
    public static void main(String[] args) {
        Circle c = new Circle(2.0);
        System.out.println("円の面積: " + c.area());

        Bird bird = new Bird();
        bird.fly();
    }
}

`java Main` で、円の面積と鳥の動作が表示されます。演習として、`Shape` を継承する `Rectangle`(長方形)クラスを作り、面積を計算させてみましょう。抽象クラスが「共通の土台」を、インターフェースが「能力の約束」を担っていることを意識してみてください。

よくある疑問・つまずきポイント

**結局、どちらを使えばいいですか?**

「is-a(〜の一種)」の関係で共通の土台を持たせたいなら抽象クラス、「〜できる」という能力を複数のクラスに持たせたいならインターフェースが向いています。1つのクラスが継承できる抽象クラスは1つだけですが、インターフェースは複数実装できます。

**インターフェースのメソッドにpublicが必要ですか?**

実装する側では `public` を付けます。インターフェースのメソッドは公開が前提だからです。

まとめ(目安8分)

今日は抽象クラス(共通の土台)とインターフェース(能力の契約)の役割と違いを学びました。これでオブジェクト指向の主要な柱がすべて揃いました。明日は総集編として、6日間の内容を1つのプログラムでまとめて復習します。

コメント

タイトルとURLをコピーしました