我有以下方法:
class TestBase {
def base(value: Int) = println(value)
}
现在,我想覆盖它并添加一些函数,执行应该由调用者带入范围的副作用。我的意思是来电者会决定添加什么副作用。我试过这样的话:
class TestDerived extends TestBase{
override def base(value: Int)(implicit ev : Int => Unit) = println("Overriden")
//Error, Method 'base' overrides nothing
}
但是这段代码拒绝编译。我怀疑,但不确定implicits
是否是方法签名的一部分。那么,还有其他方法让调用者提供他们自己的副作用函数版本。我不能只将隐式参数添加到基类的原因是我使用akka.Actor
而我无法修改akka.actor.receive: Receive
的签名。
答案 0 :(得分:2)
我不认为这是可行的
如果我使用基指针调用派生函数:
val o: TestBase = new TestDerived
o.base(1)
由于编译时编译器添加了隐式参数,但这里编译器只查找基函数签名,因此编译器不会生成隐式参数。
答案 1 :(得分:1)
可以实现相同的行为,但不能通过覆盖方法。你有几个选择:
<强> 1。将隐式移动到构造函数
class TestDerived()(implicit ev: Int => Unit) extends TestBase {
override def base(value: Int) {
println("Overriden")
}
}
<强> 2。用另一种方法包装基本方法
class TestDerived() extends TestBase {
def base2(value: Int)(implicit ev: Int => Unit): Unit = {
// implement whatever logic you want here.
ev(base(value))
}
}