在Java中重载抽象方法?
Posted
技术标签:
【中文标题】在Java中重载抽象方法?【英文标题】:Overloading an Abstract method in Java? 【发布时间】:2021-12-16 10:25:14 【问题描述】:我有以下接口和抽象类:
public interface DataExporter
MultipartFile export() throws IOException;
public abstract class AbstractExporter<T> implements DataExporter
protected abstract Iterable<T> getData();
我在导出器类中调用getData()
方法,如下所示:
public class EmployeeExporter extends AbstractExporter<EmployeeDTO>
protected Iterable<EmployeeDTO> getData()
// code omitted
但是,在另一个类中,例如ManagerExporter,我需要将参数传递给getData()
方法:
public class ManagerExporter extends AbstractExporter<ManagerDTO>
protected Iterable<ManagerDTO> getData(UUID uuid)
// code omitted
我认为在AbstractExporter
中重载该方法不是一个好主意,
因为在那种情况下,EmployeeExporter
即使不使用它也需要实现它。那么,使用带 & 不带参数的 getData()
方法最合适的方法是什么?
注意:我可能还需要其他需要多个参数的实现,例如protected Iterable<ManagerDTO> getData(UUID uuid, UUID departmentUuid, UUID staffUuid)
。在这种情况下,我是否需要使用 Object[]
之类的 Object 数组等?
【问题讨论】:
其他人没有接口/抽象类的经验吗? @ChrisPratt 请回复? 如果你需要不同的方法签名,那么你不应该扩展同一个抽象类。 @LouisWasserman 在这种情况下,我该怎么办?您能否发布一个答案来解释您的建议? uuid 参数是什么的 id?它是否确定了哪个经理或其他东西?是否有可能将其传递给 ManagerExporter 构造函数而不是 getData() 方法?或者您是否需要能够从 ManagerExporter 的单个实例中导出不同的数据集? 【参考方案1】:如果你需要不同的方法签名,那么你不应该扩展同一个抽象类。
所以……别打扰了。
public interface DataExporter
MultipartFile export() throws IOException;
public class EmployeeExporter implements DataExporter
protected Iterable<EmployeeDTO> getData()
// code omitted
public class ManagerExporter implements DataExporter
protected Iterable<ManagerDTO> getData(UUID uuid)
// code omitted
【讨论】:
你的意思是我在AbstractExporter
类中需要protected abstract Iterable<T> getData();
和protected abstract Iterable<T> getData(UUID uuid);
这两个抽象方法?
没有。我的意思是您需要零个抽象方法和零个抽象类,并且您应该完全根据您告诉我们的内容删除AbstractExporter
类。
非常感谢。那么我应该在界面中使用2方法吗?您能否添加我发布的接口和其他类?我很困惑。
没有。界面不应更改。任何类型都不应该同时拥有这两种方法。
能否请您添加我发布的接口和其他类?【参考方案2】:
这取决于您将如何使用 DataExporter。如果你想使用这个类的两个方法,那么你必须在所有实现中添加一个方法,否则,你不需要在父类中使用这些方法。
【讨论】:
发布一个涵盖我问题中所有类的示例代码怎么样?【参考方案3】:你需要查看你调用getData()
的代码。
在您最初的问题中,您说“我在导出器类中调用getData()
方法,如下所示”。但是您在下面显示的不是调用,而是抽象方法的具体实现。
getData()
方法是受保护的,所以它只被 AbstractExporter 或其子类调用。 AbstractExporter 是否至少有一个调用getData()
的具体方法实现?
如果没有,那么您可以简单地从该抽象类中删除 getData()
。所有对getData()
的调用都在子类中,它们大概知道要传递的正确参数。 getData()
方法可以从抽象类中移除,并在具体实现类中声明(可能是私有的)。
public interface DataExporter
MultipartFile export() throws IOException;
public abstract class AbstractExporter<T> implements DataExporter
// No call to getData() occurs anywhere in this class
public class EmployeeExporter extends AbstractExporter<EmployeeDTO>
private Iterable<EmployeeDTO> getData()
// code omitted
public class ManagerExporter extends AbstractExporter<ManagerDTO>
private Iterable<ManagerDTO> getData(UUID uuid)
// code omitted
如果 AbstractExporter 包含对 getData()
的调用,那么它如何确定应该将哪些参数传递给该方法?有什么腥味。 AbstractExporter 的实例可以互换使用。每个子类都应该知道如何使用相同的参数集执行getData()
。如果 ManagerExporter 需要 UUID 来执行其导出,那么您可以在构造实例时分配该值,而不是将其作为参数传递给 getData()
。
public interface DataExporter
MultipartFile export() throws IOException;
public abstract class AbstractExporter<T> implements DataExporter
protected abstract Iterable<T> getData();
public MultipartFile export() throws IOException
// Call to getData() occurs here or somewhere else in this class
public class EmployeeExporter extends AbstractExporter<EmployeeDTO>
protected Iterable<EmployeeDTO> getData()
// code omitted
public class ManagerExporter extends AbstractExporter<ManagerDTO>
private uuid;
public ManagerExporter( UUID uuid )
// The uuid is determined when the object is constructed
this.uuid = uuid;
protected Iterable<ManagerDTO> getData()
// Use this.uuid in my implementation
【讨论】:
感谢您的解释,但最好还是专注于代码。我可能解释得不好,但代码显示了一切。我认为通过查看代码问题很清楚,我只想重载带有/不带参数的 getData() 方法。不管我为什么使用参数,也不管参数的类型。以上是关于在Java中重载抽象方法?的主要内容,如果未能解决你的问题,请参考以下文章
Java中的(构造方法方法重载final修饰符使用及继承和抽象)