缺少多重继承的解决方法

时间:2019-07-27 17:22:57

标签: java inheritance interface multiple-inheritance

我目前正在从事视频游戏(分配),而我遇到的问题如下:

播放器可以垂直和水平移动,但是某些其他对象只能垂直或水平移动。我希望有一个抽象类“ Horizo​​ntalMovingObject”和“ VerticalMovingObject”,并有一个抽象类“ MovingObject”来扩展这两个类。我想知道是否有解决方法?

我目前有这些抽象类,但是发现自己不断将代码从一维移动类复制到常规移动类中。我尝试了几件事,但是都感觉不对。我通过用于一维运动部件的接口进行工作,但是存在默认的基础行为,该行为应扩展到沿该方向运动的所有对象,因此一遍又一遍地编写这些对象是错误的。我尝试了相反的操作,例如,水平类扩展了MovingObject类,但是将其所有垂直分量设置为0,这在某种程度上让情况更糟。

我知道这似乎不是一个非常重要的细节,但是由于某种原因,它使我发疯。主要是因为我来自C ++。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

  

我希望有一个抽象类“ Horizo​​ntalMovingObject”,并且   “ VerticalMovingObject”,并具有抽象类“ MovingObject”   扩展了这两个类。

解决方法是界面。
MovingObject应该同时实现HorizontalMovingObjectVerticalMovingObject

  

我目前有这些抽象类,但是经常发现自己   将代码从一维移动类复制到常规   感动的课堂。我尝试了几件事,但都觉得不对劲   不知何故。

Java 8引入了默认方法,这些方法允许定义接口的默认实现。
请注意,如果一个类同时实现HorizontalMovingObjectVerticalMovingObject,它们都具有相同的默认方法,则应重写它以使该类编译:默认接口允许混合来自不同接口的继承行为,而不会产生歧义存在关于继承哪种方法的信息。如果不是这种情况,则会发生编译错误。

要达到此要求的Java 8接口默认方法的另一种方法是使用装饰器模式:在特定装饰器类中定义要重用的行为的每个部分,链接设计为可一起使用的装饰器,并将其添加到装饰类,需要这些特定的行为。
这种方法偏重于继承而不是继承,并且需要更多样板代码,但更灵活。

答案 1 :(得分:0)

可以使用多重接口的默认方法来解决多重继承问题。

我个人认为这不是一个好主意,这不是默认方法的用处,但从技术上讲,这是一个可以理解的漏洞

对我来说,更好的解决方案可以是拥有一些MovingObjectAbs类,这些类将保留水平和垂直类都将扩展的共享方向无关逻辑,或者使某些实用程序类具有共享逻辑。 / p>