我需要接口方面的建议。我有一个名为Unit的类可以攻击其他单位。攻击可以是空中或地面。我需要单一方法来实现名为attack()
的攻击。有些单位只能攻击地面单位,某些空中单位或两者。
这是我到目前为止所得到的:
public interface Attack() {
public void attack(SCObject object);
}
public interface GroundAttack() extends Attack {
public void groundAttack(SCObject object);
}
public interface AirAttack() extends Attack {
public void airAttack(SCObject object);
}
我可以有不同的单位:
Unit extends SCObject implements GroundAttack {
}
Unit extends SCObject implements AirAttack {
}
Unit extends SCObject implements AirAttack, GroundAttack {
}
问题是这个实现将揭示两个地面和空中选项,而我只希望attack()
方法可见。
你能提出解决方案,或者这对你好吗?
答案 0 :(得分:4)
我会用
public interface Attack {
public boolean canAttack(SCObject object);
public void attack(SCObject object);
}
如果您不想暴露此行为,我认为没有理由采用特定的地面或空袭方法。
答案 1 :(得分:3)
我认为visitor或double-dispatch模式可能适用于此处,因为攻击能力取决于攻击者和受害者之间的互动。
攻击者attacks()
以及将本身作为参数传递的某种形式的调用将允许受害者确定攻击的有效性。请注意,这可以让您在运行时更改攻击性(例如,'地面'单位可以播出吗?)