【问题标题】:How to call a certain classes methods (inheritance)如何调用某个类的方法(继承)
【发布时间】:2012-03-27 08:35:13
【问题描述】:

我正在编写一个小型 java 游戏,其中有各种类型的怪物、几个计算机控制的玩家和一个人类控制的玩家。游戏世界是一个相当基本的 2D 网格。声明网格以便它需要 Humanoid 对象。即Humanoid [][] grid。但是,对于每种类型的字符,都需要覆盖人形代码的各个部分。

我遇到的一些问题是,如果代码需要 Humanoids,我如何调用人类特定的移动方法,以及如何检查移动的边界。

如果有什么不清楚的地方,请告诉我。

谢谢

注意:我的类人机器人类没有移动方法,由于我为类做这个,所以也不允许

【问题讨论】:

  • 你根本不需要做任何事情,谷歌'Java多态性和继承'

标签: java inheritance


【解决方案1】:

你不需要做任何事情。如果你有一个Humanoid 类,有一个move 方法,以及一个从Humanoid 扩展的Human 类,有它自己的move 方法,当你调用move 时,将使用人类的版本(如果您在 Human 实例上调用它)。

如果你这样做了

Humanoid human = new Human();
human.move();  // Human's move is invoked

Humanoid orc = new Orc();
orc.move(); // Orc's move is invoked

运行时自动调用适当的移动方法。

【讨论】:

  • 谢谢。但是我的类人机器人没有移动方法,也不允许这样做。
  • 你能不能创建一个 Humanoid 的子类,然后让你的所有生物都使用 那个 子类,而不是 Humanoid?
  • 很遗憾没有。我认为关键是我必须在调用方法之前进行转换。但我只是对如何做到这一点感到困惑。我认为我首先遍历网格,直到找到人类实例(例如),然后进行转换,然后调用该方法。但这似乎很痛苦
  • 我认为问题的关键可能在于投射,所以扔掉。
【解决方案2】:

如果您覆盖子类中的方法,则无需执行任何特殊操作即可调用它们。只需调用 Humanoid 变量上的方法,无论实例是什么实际类,这就是将运行的方法的版本。

您可能希望将Humanoid 设为具有抽象方法的抽象类,而这些抽象方法必须在子类甚至接口中定义。但即使您在Humanoid 中使用代码定义了一个方法,然后在子类中使用不同的代码覆盖相同的方法,它也会起作用。当您调用它的对象是子类的实例时,子类的方法版本将运行,即使您的变量是Humanoid 类型,而不是子类。

【讨论】:

    【解决方案3】:

    继承的意义在于你不必知道你在操作哪个子类。例如,假设人类和怪物共享一个名为“Mobile”的基类,而 Mobile 有一个抽象方法“move”。人类可能会超越移动来穿越地图,鸟类可能会超越它来飞行,陆鲨可能会在地下游泳。

    问题是,您的地图只需调用 Mobile.move(),该操作将委托给实际的子类来进行移动。

    如果你必须知道你使用的是哪个类,那你就做错了——但有时你需要知道一些关于类的信息,例如,如果地形无法通行,那么你可以调用 Mobile.canFly()查看给定的小动物是否支持飞行。

    稍后,如果您决定人类可以通过法术飞行,您只需修改人类类,其他一切都可以正常工作,但如果您测试了类并且只允许“秃鹰”、“鹰”和“龙”飞越障碍,那么如果您更改或添加代码,则修复起来会更加混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 2021-11-30
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多