我尝试使用mixin组合使用函数,但sshpass
对象的apply
方法出错:
覆盖方法适用于obj
类型的trait t
;方法(s: String)String
需要apply
修饰符。
如何解决这个错误,哪个是正确的实现?
abstract override
答案 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:
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