java - 如果具有相同接口(interface)的类具有相似但不同的方法签名怎么办?

标签 java design-patterns interface

如果具有相同接口(interface)的类具有相似但不同的方法签名怎么办?

假设我有一个计算不同成本的项目(最终获得总成本)。

在我的程序中,有几个计算器类,分别是ACostCalculatorBCostCalculator等。当调用 calculate() 方法来计算成本时,成本容器也会传递给那些成本计算器。在一个好的场景中,我可以为每个成本计算器制作一个 CostCalculator 接口(interface)。

但是,不同成本的计算需要不同的资源。在我当前的程序中,它就像:

//getResource() are costly method while several costs need this. So do it outside calculate() method.
ResourceA resourceA = getResourceA(); 
ResourceB resourceB = getResourceB();

CostContainer costContainer = new CostContainer();
CostCalculator aCostCalculator = new ACostCalculator();
...
CostCalculator eCostCalculator = new ECostCalculator();

aCostCalculator.calculate(costContainer);
bCostCalculator.calculate(costContainer)
cCostCalculator.calculate(costContainer, resourceA);
dCostCalculator.calculate(costContainer, resourceA);
eCostCalculator.calculate(costContainer, resourceA, resourceB);

如果签名完全相同,我可以方便地循环一次。然而,由于它们既相似又不同,我连一个好的界面都做不出来。

我不确定是否有好的方法可以这样做。我能想到的是将所有 calculate() 方法概括为 into

calculate(CostContainer costContainer, List<Object> resources);

有什么想法吗?感谢您的回答。

最佳答案

如果资源在计算器的生命周期内保持不变:将资源传递给计算器的构造函数。

ResourceA resourceA = getResourceA(); 
ResourceB resourceB = getResourceB();

CostContainer costContainer = new CostContainer();

CostCalculator aCostCalculator = new ACostCalculator();
CostCalculator bCostCalculator = new BCostCalculator();
CostCalculator cCostCalculator = new CCostCalculator(resourceA);
CostCalculator dCostCalculator = new DCostCalculator(resourceA);
CostCalculator eCostCalculator = new ECostCalculator(resourceA, resourceB);

aCostCalculator.calculate(costContainer);
bCostCalculator.calculate(costContainer);
cCostCalculator.calculate(costContainer);
dCostCalculator.calculate(costContainer);
eCostCalculator.calculate(costContainer);

关于java - 如果具有相同接口(interface)的类具有相似但不同的方法签名怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760780/

相关文章:

c# - 错误 : Does not implement interface member

java mapstruct 1.3.1 忽略双向 DTO 映射列表中的属性

java - Spring Boot application.properties 生命周期

java - 有没有办法使用 SauceLabs 的 RemoteWebDriver 禁用 CORS 检查

c++ - 初始化不可复制的成员

java - 分离数据模型和图形用户界面表示的设计模式

oop - 我们是否应该始终使用工厂而不是使用 'new' 关键字创建对象?

Java 基础 - 实现在哪里进行?

java - 黑莓后台监听线程

MDN 中的 JavaScript 接口(interface)