方法重载可以自动在接口实现之间进行区分吗?

问题描述

我有两个实现接口的类:

public interface Vehicle {…}
public class Car implements Vehicle {…}
public class Shoes implements Vehicle {…}

在用户级别,我正在处理接口,并且功能通常采用function(Vehicle v)的形式:

public class Controller {

    @Inject
    Service service;

    public int get(Vehicle v) {
        return service.getShortestPathLength(v);
    }
}

但是,在某个时候,我希望有一种方法能够区分实现,因为该特定部分的操作非常不同(例如,在我的示例中,通过步行,乘汽车,乘飞机或乘船将完全不同)。也就是说,我希望getShortestPathLength(v)根据if的实现自动切换(即不进行明确的v测试)到正确的重载方法:

public class Service {

    public int getShortestPathLength(Car c) {…}
    public int getShortestPathLength(Shoes s) {…}

}

但是它似乎无法按原样工作,但出现了未解决的编译问题错误:

类型getShortestPathLength(Vehicle)中的方法Service不适用于参数(Car)

我要实现的目标是可能的吗?如果可以,我想念的是什么?

我目前的解决方法是在v.getClass().getSimpleName()内测试getShortestPathLength(Vehicle v),但是尽管它可以工作,但似乎并不是对面向对象程序设计的优化使用。

FWIW我正在Quarkus 1.6.0上运行Java 11。

解决方法

我可以提出三种选择:

  • 将getShortestPathLength()移至Verhicle,并根据Car和Shoes的各个字符来实现不同的实现。此选项增加封装。该选项是否可以实现取决于您的逻辑。如果可以使用Verhicle中的数据来实现getShorttestPathLength,则不需要其他信息
  • 使用Service中的重载技术声明3个不同的函数,并将Service实现中的代码划分为有意义的小块,以使其在不同的函数中重用。通过使用此选项,我们必须为每个调用提供正确的参数类型,以获取正确的加载方法。
  • 使用一种方法声明服务的接口:getShortesPathLength。使用不同的逻辑为Service实现不同的变体。正确注入Service实例,以便可以调用正确的实现。此选项基于服务的多态性

您的解决方法还不错,但是我认为在运行时检查实体类型并不是一个好主意。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...