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,而不是Monster。 即使以後添加了可破壞的盒子,也可以用同一個合約來處理。
抽象類別和繼承
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 列出所有具體類型。
介面表達角色,抽象類別提供共同的基礎。 如果可以組合小的、可組合的對象,它通常比繼承更簡單。