使用mixin组合与scala中的函数

时间:2016-10-04 02:01:07

标签: scala function mixins

我尝试使用mixin组合使用函数,但sshpass对象的apply方法出错:

覆盖方法适用于obj类型的trait t;方法(s: String)String需要apply修饰符。

如何解决这个错误,哪个是正确的实现?

abstract override

2 个答案:

答案 0 :(得分:1)

您的直接问题(它抱怨错误的原因)是您在线性化流程中无法进行抽象调用(您的t.apply调用super.apply,这是抽象的)。

此外,您在顶级匿名类中定义的apply方法会覆盖所有内容,而不会调用super,从而使t完全无关紧要。

这样的事情可以解决这两个问题:

trait t extends Function1[String,String] {
  abstract override def apply(s: String): String = {
    println("Advice" + s)
    super.apply(s) // I rearranged this a little, because it kinda makes more sense this wat
  }
}

 // Note, this extends `Function1`, not `t`, it, just a "vanilla" Function1
class foo extends Function1[String, String] {
   def apply(s: String): String = s
}


// Now I am mixing in the t. Note, that the apply definition 
// from foo is now at the bottom of the hierarchy, so that 
// t.apply overrides it and calls it with super 
val obj = new foo with t
obj("foo")

答案 1 :(得分:0)

如果您不调用abstract,则无需在t特征定义中使用super.apply修饰符。在这种特殊情况下,我没有看到任何需要调用super.apply,因为Function1的apply是抽象的。您可能需要自定义应用实现。以下代码应该可以使用。

trait t extends Function1[String, String] {
  override def apply(s: String): String = {
    // super.apply(s)
    println("Advice" + s)
    s
  }
}

案例1:在t trait:

中使用重写的apply方法
val obj = new Function1[String, String] with t {} 
obj.apply("hello") // prints: Advicehello

案例2:在匿名类中覆盖t特征中的apply方法:

val obj = new Function1[String, String] with t {
  override def apply(s: String): String = s
}

obj.apply("hello") // prints hello