一
val
不接受参数,因为它是计算的并存储在字段中。但我可能会把过去两天我在邮件列表上所做的大量文章介绍给你。
或者,更确切地说,让我们从Java的角度来考虑它,因为斯卡拉在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
昂贵的手术
,它不接收参数并返回
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
}
}
如何定义?斯卡拉会复制吗
apply
的身体作为身体
昂贵的手术
(接收参数的那个,不是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必须跟踪所有类型化的函数
瓦尔
以确定它是否覆盖
def
或者没有。