【问题标题】:Workaround for a lack of multiple inheritance缺少多重继承的解决方法
【发布时间】:2019-12-05 15:36:35
【问题描述】:

我目前正在制作一个视频游戏(作业),我遇到的问题如下:

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

我目前有这些抽象类,但发现自己不断地将代码从一维移动类复制到常规移动类。我尝试了几件事,但不知何故都觉得不对劲。我通过一维移动部件的接口工作,但是有一个默认的底层行为应该扩展到所有沿该方向移动的对象,因此一遍又一遍地编写这些感觉是错误的。我尝试了相反的方法,例如,水平类扩展了 MovingObject 类,但它的所有垂直分量都设置为 0,不知何故感觉更糟。

我知道这似乎不是一个非常重要的细节,但不知为何它让我发疯了。主要是因为我来自 C++。

感谢任何帮助!

【问题讨论】:

    标签: java inheritance interface multiple-inheritance


    【解决方案1】:

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

    解决方法是接口。
    MovingObject 应该同时实现 HorizontalMovingObjectVerticalMovingObject

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

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

    实现此要求的 Java 8 接口默认方法的替代方法是使用装饰器模式:定义要在特定装饰器类中重用的行为的每个部分,链接设计为协同工作的装饰器,并将它们添加到需要这些特定行为的装饰类。
    这种方法有利于组合而不是继承,需要更多样板代码,但更灵活。

    【讨论】:

    • 不知道默认方法,这正是我需要的,谢谢。
    【解决方案2】:

    可以为多重继承完成的一种解决方法是使用接口的默认方法。

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多