オブジェクト指向の最終日は、設計をより柔軟にする「インターフェース」と「抽象クラス」です。どちらも「中身が未完成のメソッド」を扱う点が似ていて、初心者が混同しやすいところです。今日は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("羽ばたいて飛ぶ");
}
}
両者の違いを図で整理します。
【実践】図形と「飛べる」能力を作る(目安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つのプログラムでまとめて復習します。

コメント