Aval
不接受参数,因为它被计算并存储在一个字段中。但我可能会向您推荐我过去两天在邮件列表中所做的大量帖子。
或者,更确切地说,让我们从 Java 的角度考虑它,因为 Scala 在 jvm 级别与 Java 兼容,它肯定必须遵守 jvm 规则。让我们从第一堂课开始:
abstract class X {
def expensiveOperation(p: Int => Boolean) : List[Int]
}
现在,让我们扩展它:
abstract class Y extends X {
override val expensiveOperation: ((Int) => Boolean) => List[Int]
}
所以,从 Java 中,我们知道类X
有方法expensiveOperation
,它接收Function1[Int, Boolean]
和返回List[Int]
。
现在我们去上课Y
。自然,它必须定义相同的方法,但它还必须定义 getter expensiveOperation
,它不接收任何参数并返回Function1[Function1[Int, Boolean],List[Int]]
。
只要不存在这种附加方法,它可能是可行的X
。所以让我们定义它:
class Z extends Y {
override val extensiveOperation = new Function1[Function1[Int, Boolean], List[Int]] {
def apply(p: Int => Boolean) = List range (1, 10) filter p
}
}
这是如何定义的?Scala 是否将apply
的主体复制为expensiveOperation
(接收参数的主体,而不是 getter 的主体)?它可能仍然可行。不过,让我们尝试其他方法:
class W(f: ((Int) => Boolean) => List[Int]) extends Y {
override val extensiveOperation = f
}
现在,我们如何覆盖参数接收extensiveOperation
?我想我们可以这样写:
override def extensiveOperation(p: Int => Boolean) = extensiveOperation.apply(p)
这是可行的。但我个人认为这有点令人费解。我的建议:写一个简短的 SID,并在 Scala 邮件列表上达成一致。但是,如果没有代码来实现它,我认为它被采用的机会不大——Scala 必须跟踪每个函数类型val
来确定它是否覆盖了 a def
。