【问题标题】:Interface implementation hiding method接口实现隐藏方法
【发布时间】:2012-08-13 10:01:13
【问题描述】:

我需要有关接口的建议。我有一个名为 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() 方法可见。 您能提出解决方案吗?或者您觉得这样可以吗?

【问题讨论】:

  • 您的限制(空中与地面)是静态的(即在编译时可解决)还是动态的(在运行时可解决)?

标签: java inheritance interface


【解决方案1】:

我会用

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

鉴于您不想暴露这种行为,我认为没有理由采用特定的地面或空中攻击方法。

【讨论】:

  • 访客模式在这里也可能有用。
  • @BrianAgnew 感谢您修正错别字。
  • 如果不实现任何接口单元不能攻击。并且没有实施 AirAttack 的单位无法攻击飞行单位。
  • @locke 这个要求从何而来?这是你必须忍受的事情还是你可以解决的事情?
  • @PeterLawrey 它来自我的脑海,我想修复它。
【解决方案2】:

我认为visitor 或double-dispatch 模式可能适用于此,因为攻击能力取决于攻击者和受害者之间的交互。

某种形式的调用,其中攻击者attacks(),并将自身作为参数传递,将允许受害者确定攻击的有效性。请注意,这可以让您在运行时更改可攻击性(例如,“地面”单位可以升空吗?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多