假设我正在编写一些库存代码:
public void showInventory(List<Item> items) {
for (Item item : items) {
if (item instanceof ContainerItem) {
// container display logic here
}
else if (item instanceof WeaponItem) {
// weapon display logic here
}
// etc etc
}
}
这将编译并正常工作。但它错过了面向对象设计的一个关键思想:你可以定义父类来做一般有用的事情,并让子类填写特定的、重要的细节。
上述替代方法:
abstract class Item {
// insert methods that act exactly the same for all items here
// now define one that subclasses must fill in themselves
public abstract void show()
}
class ContainerItem extends Item {
@Override public void show() {
// container display logic here instead
}
}
class WeaponItem extends Item {
@Override public void show() {
// weapon display logic here instead
}
}
现在,我们有一个地方可以查看,即方法,用于清单显示逻辑的所有子类。我们如何访问它?容易!show()
public void showInventory(List<Item> items) {
for (Item item : items) {
item.show();
}
}
我们将所有特定于项目的逻辑保留在特定的 Item 子类中。这使您的代码库更易于维护和扩展。它减少了第一个代码示例中长 for-each 循环的认知压力。而且它准备在你甚至还没有设计的地方重复使用。show()