0
trait Rectangular{
def topLeft:Point
def bottomRight:Point
def left=topLeft.x
def right=bottomRight.x
def width=right-left
//andmanymoregeometricmethods...
}


class Rectangle(val topLeft:Point,val bottomRight:Point)
extends Rectangular{
//othermethods...
}

在 Rectangular 中,他定义了一个抽象函数,并在 Rectangle 类中实现它,并在主构造函数中使用 val。

这是特质的特例吗?这是预期的行为吗?

之前他描述了只有 def's 可以覆盖 def's。但是在这种情况下,一个 val 实现了一个抽象函数,这真的很奇怪。

4

2 回答 2

3

aval实际上是定义同名私有变量和公共 getter 方法的语法糖,所以 aval基本上包括 a def。当你def用 a覆盖 a 时val,编译器使用 getter 方法作为覆盖 的函数def。你也可以def用 a覆盖 a var,它同时定义了一个 getter 和一个 setter 方法(尽管我通常不会认为这种行为是“好的”代码)。

使用defdo define 抽象属性允许实现者选择是否要使用valvardef.

所以,如果作者声称只能defoverride def,那是不正确的(也许在早期版本的 Scala 中就是这种情况?)。

于 2012-09-17T17:26:49.420 回答
1

不幸的是,我从未读过那本书(我感到羞耻)。但这是错误的。def您可以用 aval或 a覆盖a lazy val。这种模式很常见。

为避免奇怪的行为,强烈建议避免使用 abstract val

于 2012-09-17T17:17:02.033 回答