如何解决方法重载可以自动在接口实现之间进行区分吗?
我有两个实现接口的类:
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实例,以便可以调用正确的实现。此选项基于服务的多态性
您的解决方法还不错,但是我认为在运行时检查实体类型并不是一个好主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。