在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&lt;ManagerDTO&gt; 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&lt;T&gt; getData();protected abstract Iterable&lt;T&gt; 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修饰符使用及继承和抽象)

韩顺平 java笔记 第9讲 第10讲 第11讲 第12讲 抽象 封装 继承 多态 方法重载 方法重写

Java八股文之基础篇

Android-Java-普通类与抽象类(覆盖)&方法重载

JAVA 重写&重载/多态/抽象类/封装/接口/包

java--面向对象重点