【问题标题】:Inheriting from a superclass that may be of multiple types in Java从 Java 中可能具有多种类型的超类继承
【发布时间】:2013-04-04 18:37:12
【问题描述】:

我正在使用 libGDX 库编写游戏,我有两个边界框,用于碰撞检测,一个用于可旋转对象,一个用于不可旋转对象。可旋转的继承自不可旋转的。

我想制作一个游戏实体类,它具有渲染调试形状和动画等通用功能,并存储与游戏中所有实体相关的其他游戏信息。我只想从这个类上写,然后扩展它以产生所有的游戏元素,但我想不出一种方法,因为其中一些可以旋转,而另一些则不能。现在我曾想过简单地将边界框作为一个全局对象,但我又想不出一种方法来构造一个全局变量,该变量可以是两种类型,具体取决于我如何实例化对象。

有人可以帮忙吗?还是我正在做的只是错误的做事方式?

【问题讨论】:

  • @jahroy 维基百科!恐怖!

标签: java inheritance multiple-inheritance


【解决方案1】:

您可以使用组合而不是继承。所以,例如:

class Box {}
class RotatableBox extends Box {}
class GameElement {
  Box box; // could be RotatableBox
}

然后,您可以从框中委派所需的任何方法,以便可以直接从游戏元素访问它们。

【讨论】:

  • 除了如果它是一个 RotatableBox 我无法访问任何其他功能。
  • 也许您应该在问题中指定子类需要其他方法;)我认为大多数阅读该问题的人都会做出相同的假设,除非您提供更多细节。提供一些示例代码总是有帮助的。有什么方法可以定义一个接口来定义常用方法?
  • 是的,我认为这个问题的措辞很糟糕,我打算从定义接口然后指定边界框的另一种方式来解决。
【解决方案2】:

嗯……

既然你指责我在你的 cmets 中提供了虚假信息(并声称你理解多态性),这里有一个简单的例子说明你肯定可以调用子类的方法,即使声明了对象作为父类。

class ParentClass
{
    public void sayHey()
    {
        System.out.println("I am a parent");
    }
}

class ChildClass extends ParentClass
{
    public void sayHey()
    {
        System.out.println("I am a child");
    }
}

public void testIt()
{
    ParentClass p = new ChildClass();
    p.sayHey();  // prints "I am a child"
}

同样的概念也适用于实现接口的类。

在您的游戏中,您可以使用接口或超类来表示可旋转或不可旋转的游戏实体。

您可以根据需要使用 GameEntityFactory 生成任一类型的对象。

【讨论】:

  • 如果我在 ChildClass 中添加一个名为 sayhello 的函数,这是否有效?
  • 如果您这样做,您需要将您的对象声明为 ChildClass(或强制转换)以调用 sayHello()。老实说,您不同意自己尝试找出答案会很容易吗?我敦促您花一些时间学习 Java 的基础知识。我不会再继续这个来回的问答环节了。祝你好运!
  • 你真的不明白。这就是重点。我想将两个类合并为一个在运行时实例化的类。你根本不理解这个问题,现在我很可能不会得到一个体面的答复。我只能希望你是一个巨魔,并且有人从中得到一些乐趣。
  • @user1170304 - 有时当有人不明白你在说什么时,你应该退后一步,确保你的描述有意义。我建议在您的问题中添加相当多的细节......否则您可能不会得到任何回复(或者回复者会做出与我相同的假设)。您的不同类将实现/覆盖相同的方法似乎是一个合乎逻辑的假设。我仍然认为您的问题可以通过精心设计的界面来解决,但我正在远离这个问题。我一直在努力提供帮助,但我们不在同一个页面上。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2015-03-14
  • 2010-11-08
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多