我有以下类继承(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
的属性。
副节点:由于我有多个扩展程序可以执行不同的操作,并且这些扩展程序应该很容易添加到应用程序中或从应用程序中删除,因此我不希望将它们全部合并到“核心”中。
答案 0 :(得分:0)
Factory pattern - 这是一个非常具体的架构问题,这个模式应该是你问题的答案
答案 1 :(得分:0)
您不能在Java中使用“条件继承”。要么你扩展课程,要么你不扩展课程。更改传统链意味着重新编译应用程序。
如果C扩展B扩展A但B不在类路径上,则C的类加载将失败。
我在这里看到的唯一解决方案是将此逻辑集成到您的代码中(或者具有与可能的组合一样多的实现)。
所以,是的,委托将是一种方式(可能是唯一一个只在你需要时才在你的类路径上拥有逻辑的方法)。在你的代码中有多个丑陋的ifs是另一个。