【发布时间】:2018-01-09 04:48:53
【问题描述】:
我希望能够做到:
object AddOrSubtract {
def apply(x: Int, adding: Int) = x + adding
def apply(x: Int, subtracting: Int) = x - subtracting
}
AddOrSubtract(1, adding = 5) // should be 6
AddOrSubtract(1, subtracting = 5) // should be -4
但我得到了错误:
Error:(1331, 7) method apply is defined twice;
the conflicting method apply was defined at line 1330:7
def apply(x: Int, subtracting: Int) = x - subtracting
我知道这是因为这两种方法具有相同的签名。有什么模式可以解决这个问题吗?我唯一能想到的就是使用隐式来改变值的类型,比如:
object AddOrSubtract {
implicit class AddInt(val x: Int)
implicit class SubInt(val x: Int)
def apply(x: Int, adding: AddInt) = x + adding.x
def apply(x: Int, subtracting: SubInt) = x - subtracting.x
def run(): Unit = {
AddOrSubtract(1, adding = 5)
AddOrSubtract(1, subtracting = 5)
}
}
但我很好奇是否还有其他不那么优雅的方式来实现这一点?
【问题讨论】:
-
只能使用一个参数,减法为负数,加法为正数
-
您为什么要这样做?在对象名称中加上“或”是设计不佳的症状,除非在非常特殊的情况下。在这个例子中你显然有两个对象,Add 和 Substract,可能有一个通用的操作接口或类似的东西。
-
感谢您对我的设计 volia17 质量的反馈,但该示例只是对我试图解决的问题的简化演示。
标签: scala