有条件地inheritance自上课

我有以下类inheritance( A是我的父类):

在此处输入图像描述

在某些情况下XY需要一些额外的字段和方法。 所以我基本上需要的是:

在此处输入图像描述

由于重复的代码,我不想扩展XY以使它们的子类完全相同的字段和方法。
怎么办呢? 代表唯一的解决方案是什么?


更新:真实世界的例子:

我正在从不同的文件类型导入数据:

打包my_application.core

 public class ImportFile { // the "A" protected final Path path; } public class CsvImportFile extends ImportFile { // the "X" private final String delimiter; } public class FixedLengthImportFile extends ImportFile { // the "Y" // nothing new } public class XmlImportFile extends ImportFile { private final String root; } 

有时,文件的第一行包含头/标题而不是数据。 所以这里有一个示例扩展,允许为csv和固定长度文件设置起始行:

打包my_application.extension.line_start

 public class ExtensionLineStartImportFile { // the "B" protected final int lineStart; // some methods } 

因此,如果用户选择使用扩展名line_start ,则CsvImportFileFixedLengthImportFile应获取ExtensionLineStartImportFile的属性。

侧节点:由于我有多个扩展,这些扩展做了不同的事情,这些扩展应该很容易添加到应用程序/从应用程序中删除,我不想将它们全部合并到“核心”。

工厂模式 – 这是一个相当的架构问题,这种模式应该是您的问题的答案

你不能在Java中有“条件inheritance”。 要么你扩展一个类,要么你不扩展。 更改传统链意味着重新编译应用程序。

如果C扩展B扩展A但B不在类路径上,则C的类加载将失败。

我在这里看到的唯一解决方案是将此逻辑集成到您的代码中 (或者具有与可能的组合一样多的实现)。

所以,是的,委托将是一种方式(可能是唯一一个只在你需要时才在你的类路径上拥有逻辑的方法)。 在你的代码中有多个丑陋的ifs是另一个。