【问题标题】:Whats the advantage of having Weapon as an interface over Abstract class将武器作为接口而不是抽象类的优势是什么
【发布时间】:2015-02-22 12:07:15
【问题描述】:

问题陈述:战士在战场上用武器战斗。

以图片中的情况为例,

比如说,我们有一个使用武器的职业战士。

武器可以延伸到剑、枪等。

我有一个困惑,Weapon 应该是一个接口还是一个抽象类。

如果它需要是一个接口,它有什么优势。

[编辑]

如果它是一个接口,我相信实现会是这样的。

Weapon myWeapon;
myWeapon = new Sword();

【问题讨论】:

  • 为什么myWarrior会是一把剑?总的来说,战士不是剑。
  • 这类问题更适合codereview.stackexchange.com
  • 你需要重新考虑你的类设计以及你的接口意味着什么。
  • 多重继承,如果你拿着尖刺盾怎么办?你可以用它来攻击人。是武器还是盾牌?
  • 我真的很抱歉,有一个很大的错字.. 我认为它的武器,我输入了战士:P。谢谢指出

标签: java oop


【解决方案1】:

除了战士不是武器而是使用武器这一事实之外...... ;-)

  • 如果您有通用代码并且希望所有武器都拥有,请使用抽象类。例如,如果经常使用武器,则可以使用它来破坏武器。
  • 接口可以说只是一个模板并且本身不能有实现。 (见下面的评论:默认实现。)
  • 一个类也可以有多个接口,但在 Java 中没有菱形继承,所以你只有一个基类。

【讨论】:

  • @ChiefTwoPencils:刚刚看到...我已经更正了。现在明白我的意思了吗?
  • This is what I was referring to.。不确定我们是否在同一页面上?
  • 对不起..这是一个错字..更正它
  • @ChiefTwoPencils 我做了将近 10 年的 java 并且不知道默认实现。谢谢。我将编辑我的答案。
  • 实际上默认方法是在 Java 8 中引入的,所以不久前。顺便说一句,这也启用了多重继承的可能性,顺便说一句,这与 C++ 中可能的死亡钻石不同。 Java 8 的合约可以防止这种可能性。
【解决方案2】:

所以首先 - 战士绝对不应该使用武器。

实现一个接口或扩展一个类是一种 IS A 关系。枪是武器,但战士不是。他只是使用了一个武器,这是一个构图 - 一个HAS A关系。

武器应该是界面

接口是告诉可以用实现该接口的类的对象做什么的东西。它没有说明它是如何实现的。这种分离有利于您的简洁设计。

如果所有武器或其中一些武器有任何共同行为,您可以引入一个抽象类,在层次结构中可以位于接口和具体实现之间。请注意(这是一个常见错误),行为并不意味着添加新方法。因此,如果您认为例如可以重新加载枪,那么它需要另一种方法,抽象类在这里无济于事。在这种情况下,您可以引入另一个接口,例如 Reloadable 并使 Gun 同时实现 Weapon 和 Reloadable。常见的行为是某些具体类以相同或相似的方式实现某些接口方法。然后抽象类可以实现这一个方法,但其余的不实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2013-09-21
    • 2014-07-23
    • 2020-07-06
    • 2012-04-24
    • 2011-01-10
    • 2012-04-11
    相关资源
    最近更新 更多