有条件地inheritance自上课
我有以下类inheritance( A
是我的父类):
在某些情况下 , X
和Y
需要一些额外的字段和方法。 所以我基本上需要的是:
由于重复的代码,我不想扩展X
和Y
以使它们的子类完全相同的字段和方法。
怎么办呢? 代表唯一的解决方案是什么?
更新:真实世界的例子:
我正在从不同的文件类型导入数据:
打包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 ,则CsvImportFile
和FixedLengthImportFile
应获取ExtensionLineStartImportFile
的属性。
侧节点:由于我有多个扩展,这些扩展做了不同的事情,这些扩展应该很容易添加到应用程序/从应用程序中删除,我不想将它们全部合并到“核心”。
工厂模式 – 这是一个相当的架构问题,这种模式应该是您的问题的答案
你不能在Java中有“条件inheritance”。 要么你扩展一个类,要么你不扩展。 更改传统链意味着重新编译应用程序。
如果C扩展B扩展A但B不在类路径上,则C的类加载将失败。
我在这里看到的唯一解决方案是将此逻辑集成到您的代码中 (或者具有与可能的组合一样多的实现)。
所以,是的,委托将是一种方式(可能是唯一一个只在你需要时才在你的类路径上拥有逻辑的方法)。 在你的代码中有多个丑陋的ifs是另一个。