从 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 列出所有具体类型。
接口表达角色,抽象类提供共同的基础。 如果可以组合小的、可组合的对象,它通常比继承更简单。