【问题标题】:Using inheritance to alter a superclass's interface使用继承来改变超类的接口
【发布时间】:2011-04-23 20:37:43
【问题描述】:

我来自网络开发背景。我最近一直在玩一些 Java,并且遇到了以下问题,这似乎源于严格的接口和数据类型,它们是 Java 的一部分,而不是 PHP 的一部分。

我正在使用现有的物理引擎 (Phys2D) 来开发各种游戏。这个物理引擎具有由World 管理的Body 对象,并且随着世界的步进,它们会施加各种力。对游戏中的 AI 来说,身体有颜色是很重要的(这样可以感知它们),但是物理引擎不支持,所以我创建了一个子类,并将 Body 类扩展为包括这-http://pastebin.com/1nLYWg3w。现在,当我创建这些 Body 实例时,我可以从 World 取回它们并获取它们的颜色。

但是,Netbeans 是这么说的

cannot find symbol
    symbol:   method getColour()
    location: class net.phys2d.raw.Body

因为物理引擎接口返回的Body 对象不包含此方法。我知道,在运行时,所有传递给WorldBody 对象实际上将是ColouredBody 类型的对象,因此将在其接口中定义此方法。

如何将颜色附加到Body 对象而不产生可怕的下划线和警告?我知道我可以更改 Phys2D 本身,但是,除了潜在的许可限制(许可说明您可以使用 Phys2D 进行此操作),我被告知这是不好的做法。

【问题讨论】:

  • 我链接到 pastebin 以避免混淆问题。请告知这在帖子本身是否更合适。另外,如果有什么方法可以让帖子对其他人更通用,请编辑或请求进行必要的更改。

标签: java design-patterns inheritance interface


【解决方案1】:

如果您在运行时知道所有Body 对象实际上都是ColouredBody,那么您可以将这些对象转换为ColouredBody 并调用getColour

Body body = ...;
ColouredBody colouredBody = (ColouredBody) body;
colouredBody.getColour();

【讨论】:

    【解决方案2】:

    实际上,我会说将 color 属性添加到引擎本身的 Body 类中是非常好的设计。

    如果您不能这样做或不想这样做,您只需在使用 Body 实例之前将它们转换为 ColouredBody

    ((ColouredBody)body).getColour();
    

    这告诉编译器“我知道body 确实是ColouredBody 的一个实例,所以让我像使用它一样使用它” - 但如果它在任何时候都不是,你会得到一个@987654326 @。

    【讨论】:

    • 非常感谢。我将编辑现有的类,因为这看起来更优雅。如果不允许我编辑库,并且没有更简单的选择,我会投。
    【解决方案3】:

    您可以转换为具体类型:

    ColouredBody cbody = (ColouredBody) body;
    

    最好是为了避免出现问题,你可以检查一下它是否真的是真的:

    if (body instanceof ColouredBody) {..}
    

    请注意,向下转换(从更一般的类到更具体的类)通常被认为是一种不好的做法。

    如果可能的话,您可以尝试使用 ColouredWorld 扩展 World 并覆盖返回 Body 的方法以返回 ColouredBody(并将主体保存在正确的集合中),但这可能是过度杀伤取决于复杂性。

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2015-08-03
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多