Jus*_*s S 11 java instanceof hierarchy
场景.我正在写与游戏相关的代码.在那个游戏中Player(它也是一个类)有一个列表Item.还有其他类型的项继承Item,例如ContainerItem,DurableItem或WeaponItem.
显然,对我来说这是非常方便的List<Item>.但是当我获得玩家物品时,我唯一的方法是通过使用instanceof关键字来区分什么类型的物品.我敢肯定,我已经读过,依赖它是不好的做法.
在这种情况下可以使用它吗?或者我应该重新考虑我的所有结构?
Mat*_*son 17
假设我正在编写一些库存代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这将编译和工作正常.但它错过了面向对象设计的关键思想:您可以定义父类来执行一般有用的事情,并让子类填充特定的重要细节.
以上替代方法:
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
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们show()在库存显示逻辑的所有子类中都有一个可以查看的方法.我们如何访问它?简单!
public void showInventory(List<Item> items) {
for (Item item : items) {
item.show();
}
}
Run Code Online (Sandbox Code Playgroud)
我们将所有特定于项的逻辑保留在特定的Item子类中.这使您的代码库更易于维护和扩展.它减少了第一个代码样本中长期for-each循环的认知压力.并且它准备好在show()你还没有设计过的地方重复使用.
| 归档时间: |
|
| 查看次数: |
5373 次 |
| 最近记录: |