【问题标题】:Is there a way to override and add some implicits to a method?有没有办法覆盖并向方法添加一些隐式?
【发布时间】: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 !东西。

标签: scala implicit


【解决方案1】:

我觉得不可能

如果我使用基指针调用派生函数:

val o: TestBase = new TestDerived
o.base(1)

由于隐式参数是编译器在编译时添加的,但这里编译器只查找基函数签名,所以编译器不会生成隐式参数。

【讨论】:

  • 在我的情况下,确切的调用会导致调用 TestDerived 实现并由于范围内没有隐式而引发。
  • @sebszyller 你能粘贴完整的测试代码吗?
【解决方案2】:

可以实现相同的行为,但不能通过重写方法。您有两种选择:

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

【讨论】:

  • 在构造函数中使用隐式似乎有点奇怪,因为它限制了您以后选择任何其他隐式。
  • @SarveshKumarSingh 只是突出显示可能的选项,这不是一个常见的用例,但也不是最不常见的。
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 2020-05-11
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多