替代多重继承来扩展库

Alternative to Multiple Inheritance to Extend Library

我目前正在尝试延长 WPILib。不幸的是我需要多重继承。

我画了一个问题的uml图(原谅我蹩脚的笔迹)

正如你看到的红色箭头,我需要从两个 类.

延伸

我无法更改 WPI 框内的任何内容,ICommand 中的 requires 方法需要 CommandBase 中的一些函数,因此我无法将其设为 [=] 中的默认值11=].

我该如何解决这个问题?

如果你想在这里尝试一些东西my github repo

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

接口有许多定义特征:

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

  • 接口仅包含 public 常量定义和方法头文件

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

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

Read more about Inheritance

如果我没理解错的话,您希望您的自定义 classes(SequentialCommandGroup、ParallelCommandGroup)从库 classes 扩展,但也希望您自己实现该“命令”部分。

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

您的 classes 仍将继承自库 classes,但 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();
    }
    
}

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