有没有办法覆盖并向方法添加一些含义?

时间:2016-08-23 09:58:49

标签: scala implicit

我有以下方法:

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的签名。

2 个答案:

答案 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))
  }
}