Java 基礎からマスターまで — 第4回
継承とインタフェースで多型を使用する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
複数のオブジェクトを同じ方法で使用する必要がある場合は、インターフェイスと継承を利用できます。 呼び出すコードは、具体的なクラスよりも必要な役割に依存する方が変更に強い。
インターフェース
public interface Damageable {
boolean isAlive();
void takeDamage(int amount);
}
public final class Monster implements Damageable {
private int health = 100;
@Override
public boolean isAlive() {
return health > 0;
}
@Override
public void takeDamage(int amount) {
health = Math.max(0, health - amount);
}
}
攻撃コードはモンスターではなくDamageableを受け取ればよい。 後で破壊可能な箱を追加しても同じ契約で処理することができる。
抽象クラスと継承
public abstract class Skill {
private final String name;
protected Skill(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void execute(Damageable target);
}
抽象クラスは、共通の状態と実装を共有しながら、一部の動作を子に委ねることができる。 継承は親のルールまで結合するので、単純なコード再利用のみのために深く作れば変更範囲が大きくなる。
多型
List<Damageable> targets = List.of(
new Monster(),
new TrainingDummy()
);
for (Damageable target : targets) {
target.takeDamage(10);
}
同じ呼び出しをしても、実際のオブジェクトに合った実装が実行される。 呼び出し側はinstanceofですべての具体的なタイプをリストする必要はありません。
インタフェースは役割を表現し、抽象クラスは共通の基盤を提供します。 構成可能な小さなオブジェクトを組み合わせることができる場合、継承よりもその方法がより単純な場合も多い。