我正在写一个小java游戏,里面有各种类型的怪物,几个电脑控制的玩家和一个人类控制的玩家。游戏世界是一个相当基本的2D网格。网格被声明为期望类人对象。这就是Humanoid [][] grid。但是,对于每种类型的字符,需要覆盖类人代码的各个部分。
我遇到的问题是,如果代码需要类人形,我如何调用人类特定的移动方法,以及如何检查移动的边界。
如果有什么不清楚的地方,请告诉我。
谢谢
注意:我的人形类没有move方法,因为我是为class这样做的,所以也不允许这样做。
发布于 2012-03-27 08:09:26
你不需要做任何事。如果您有一个具有move方法的Humanoid类,以及一个从Humanoid扩展而来的具有自己的move方法的Human类,当您调用move时,将使用人类的版本(如果您在人类实例上调用它)。
所以如果你这样做了
Humanoid human = new Human();
human.move(); // Human's move is invoked
Humanoid orc = new Orc();
orc.move(); // Orc's move is invoked运行库自动调用适当的move方法。
发布于 2012-03-27 08:10:06
如果重写子类中的方法,则无需执行任何特殊操作即可调用它们。只需调用Humanoid变量上的方法,无论实例实际是什么类,都是要运行的方法的版本。
您可能希望使Humanoid成为一个具有抽象方法的抽象类,这些抽象方法必须在子类中定义,甚至可以定义为接口。但是,即使您在Humanoid中使用代码定义了一个方法,然后用子类中的不同代码覆盖相同的方法,它也可以正常工作。当您在其上调用该方法的对象是该子类的实例时,该方法的子类版本将会运行,即使您的变量是Humanoid类型,而不是子类。
发布于 2012-03-27 08:13:42
继承的要点是,您不应该知道您正在操作哪个子类。例如,假设人类和怪物共享一个名为" Mobile“的基类,而Mobile有一个抽象方法"move”。人类可能会超越移动而在地图上行走,鸟类可能会超越移动而飞行,而陆地鲨鱼可能会在地下游泳。
问题是,您的映射只调用Mobile.move(),操作将被委托给实际的子类进行移动。
如果您必须知道您使用的是哪个类,那么您就做错了--然而,有时您需要知道一些关于这个类的信息,例如,如果地形是不能通过的,那么您可以调用Mobile.canFly()来查看给定的生物是否支持飞行。
后来,如果你决定人类可以通过咒语飞行,你只需修改人类类,其他一切都可以正常工作,但如果你测试了这个类,只允许"Vulture","Eagle“和"Dragon”飞越障碍物,那么如果你修改或添加它,你的代码就会变得更加混乱。
https://stackoverflow.com/questions/9881621
复制相似问题