- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在网上阅读了 n
次,应该始终尽量避免使用 instanceof
运算符,除非我们使用它来实现 .equals ()
一个类的方法。
有人说,只要有可能,我们就应该尝试实现多态性,而不是使用instanceof
来确定对象的类型来决定接下来的 Action 。
例如:http://www.javapractices.com/topic/TopicAction.do?Id=31
但是,在这个特定场景中,我在父类(super class)和子类中没有任何可用的方法(toString、equals、accessor 和 mutator 方法除外)。使用 instanceof
是否有效?
class Warrior
{
int damage;
int defense;
Item handSlot;
public Warrior(){
damage = 0;
defense = 0;
handSlot = null;
}
private void equipHand(Item item)
{
//Determine class of object to decide further actions
if (item instanceof Weapon){
this.handSlot= item;
this.damage += ((Weapon)item).getDamage();
}
else if (item instanceof Shield){
this.handSlot = item;
this.defense += ((Shield)item).getProtection();
}
}
}
class Item
{
private String name;
public Item(String name)
{
this.name = name;
}
}
class Shield extends Item
{
private int protection;
public Shield(String name, int protection){
super(name);
this.protection = protection;
}
public int getProtection(){
return protection;
}
}
class Weapon extends Item
{
private int damage;
public Weapon(String name, int damage){
super(name);
this.damage = damage;
}
public int getDamage(){
return damage;
}
}
请注意,如果Weapon, Item & Shield class
有重载方法(例如:equip()
),我可以简单地使用多态性。但是在这种情况下,equip 方法在另一个类中。 在这种特定情况下,是否可以使用 instanceof
operator?或者它仍然是一个糟糕的设计?
最佳答案
您的设计的替代方案是将 equipHand
方法从 Warrior
移动到 Item
(或许也可以根据此重命名它):
/* in Item */
public abstract void giveToWarrior(Warrior w);
/* in Weapon */
@Override
public void giveToWarrior(Warrior w) {
w.setHandSlot(this);
w.increaseDamageBy(getDamage());
}
/* in Shield */
@Override
public void giveToWarrior(Warrior w) {
w.setHandSlot(this);
w.increaseProtectionBy(getProtection());
}
(我使用了一些 Warrior
中不存在的方法,但它们的功能应该是不言自明的。进行指定的更改需要实现这些方法。)
此设计解决了您当前设计的主要问题,即添加新的 Item
子类会变得很麻烦,因为这样做还需要更新 equipHand
。
关于java - 在无法实现多态性时使用 instaceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27988978/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!