抽象クラスとインターフェイスは、プログラミングで「ルール」を作るための道具だな。簡単に言うと、「抽象クラス」は基本的なルールや機能を持った設計図、「インターフェイス」はルールだけを定めるための契約書のようなものだ。
まずは、抽象クラスのイメージを「動物園の動物たち」で考えてみよう。
// 抽象クラス
abstract class Animal {
// すべての動物は鳴くけど、どんな風に鳴くかは動物による
abstract void makeSound();
// すべての動物には名前がある
String name;
// 名前を設定するメソッド(どの動物も同じ)
public void setName(String name) {
this.name = name;
}
// 名前を取得するメソッド(どの動物も同じ)
public String getName() {
return this.name;
}
}
// 猫クラス
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("にゃー");
}
}
// 犬クラス
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("わんわん");
}
}
次に、インターフェイスは「動物が飛べるか泳げるか」をルールにして考えよう。インターフェイスは「やり方」は決めず、「こういうことができるよ」というルールだけを決める。
// 飛べる動物たちのルール
interface Flyable {
void fly();
}
// 泳げる動物たちのルール
interface Swimmable {
void swim();
}
// 鳥クラス
class Bird extends Animal implements Flyable {
@Override
void makeSound() {
System.out.println("ぴよぴよ");
}
@Override
public void fly() {
System.out.println("鳥が飛んでいる");
}
}
// 魚クラス
class Fish extends Animal implements Swimmable {
@Override
void makeSound() {
System.out.println("...");
}
@Override
public void swim() {
System.out.println("魚が泳いでいる");
}
}