【问题标题】:Alternative to Multiple Inheritance to Extend Library扩展库的多重继承的替代方案
【发布时间】:2021-12-28 10:17:50
【问题描述】:

我目前正在尝试扩展WPILib。不幸的是,我需要多重继承。

我已经画了一个问题的 uml 图(请原谅我蹩脚的字迹)

如您所见,我需要从两个类扩展红色箭头。

我无法更改 WPI 框中的任何内容,并且来自 ICommandrequires 方法需要来自 CommandBase 的一些函数,因此我无法在 ICommand 中将其设为默认值。

我该如何解决这个问题?

如果你想尝试一下这里的my github repo

【问题讨论】:

  • Java 中不可能有多重继承。如果继承不起作用,请尝试使用合成
  • 如果我使用 Composition,我还能将 SequentialCommandGroup 用作 WPI.Command 吗?
  • 你试过了吗?我唯一确定的是:多重继承在 Java 中不起作用(除非我们在谈论接口)
  • 合成到底是什么意思?我应该编写哪些类?

标签: java inheritance abstract-class multiple-inheritance


【解决方案1】:

如果我理解正确,您希望您的自定义类(SequentialCommandGroup、ParallelCommandGroup)从库类扩展,但也有您自己的“命令”部分的实现。

你当然不能在 Java 中进行多重继承,但我认为你可以在这里使用Proxy pattern

您的类仍将继承自 Library 类,但 ICommand 接口的实现可以委托给 Command 对象。

例子:

public class MyParallelCommandGroup extends ParallelCommandGroup implements ICommand {

    private Command commandProxy;
    
    public MyParallelCommandGroup() {
        // instantiate commandProxy here, or inject it as constructor param
    }
    
    @Override
    public void requires() {
        commandProxy.requires();
    }
    
}

您甚至可以将整个 Command 类提取到一个接口并在您的代理类中实现它。我不确定这是否涵盖了您的用例,但也许它会帮助您找到合适的解决方案。

【讨论】:

    【解决方案2】:

    使用Interface,因为java is not supports Multiple Inheritance。接口是指定要实现的类的行为的抽象类型。因为它们是抽象的,所以接口不包含对其行为的详细说明。相反,这些类提供了接口行为的具体实现。

    接口有许多定义特征:

    • 与类不同,您不实例化接口。相反,类 实现接口

    • 接口只包含公共常量定义和方法头

    • 接口只能扩展其他接口,不能扩展类

    • 接口可以扩展多个接口,类可以实现 多个接口

    Read more about Inheritance

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多