2012-08-13 61 views
0

我需要关于接口的建议。我有一个单位可以攻击其他单位。攻击可以是空中或地面。我需要单一的方法来实现攻击,称为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

您的限制(空对地​​)是静态的(即可在编译时解析)还是动态的运行) ? – 2012-08-13 10:06:51

+0

在运行时解决此问题 – 2012-08-13 10:15:52

回答

4

我会用

public interface Attack { 
    public boolean canAttack(SCObject object); 
    public void attack(SCObject object); 
} 

我不明白了一个道理有一个特定的地面或空中攻击方法给你不想揭露这种行为。

+1

访问者模式在此也可能有用。 – duffymo 2012-08-13 10:07:42

+0

@BrianAgnew感谢您解决错别字。 – 2012-08-13 10:08:31

+0

如果你没有实现任何接口单元不能发起攻击。并且不实施AirAttack的单位不能攻击飞行单位。 – 2012-08-13 10:09:57

3

我觉得visitordouble-dispatch模式可以适用于此,因为有能力攻击依赖于攻击者和受害者之间的相互作用。

某些形式的调用,攻击者attacks(),并通过本身作为参数将允许受害者确定攻击的有效性。请注意,这可以允许您在运行时改变攻击能力(例如,“地面”单元可以空中飞行吗?)