【发布时间】:2016-08-23 18:31:50
【问题描述】:
我有以下方法:
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 的签名。
【问题讨论】:
-
在 Scala 和 Java 中,不同的签名意味着不同的方法,因为您的方法具有不同的签名,它不能覆盖其他方法。
-
只是好奇如果你能用隐式覆盖actor recevie,你会怎么称呼它?你用tell或ask向actor发送消息,然后由akka本身调用receive。
-
@FatihDonmez 好吧,我刚刚提供了隐式导入的值。怎么了?
-
如果你提供了import而不需要改变方法签名,它可以在receive方法内部使用。使方法接受隐式意味着当它调用 obj.method 时,它可以隐式地获取其他一些东西。在这种情况下,您没有直接调用actor recevie,这意味着没有像actorRef.recevie 这样的东西。你做 actorRef !东西。