2012-09-17 24 views
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... 
} 

在矩形他定义抽象功能,他与主构造一个VAL实现它在类Rectangle摘要功能。Scala的 - 在性状

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

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

+0

谁是'他'?这是一本书摘录吗? – paradigmatic

+0

http://www.amazon.com/Programming-Scala-Comprehensive-Step---Step/dp/0981531644/ref=sr_1_1?ie=UTF8&qid=1347900072&sr=8-1&keywords=SCALA –

+1

如果我是你, d远离那本书。不仅是错误的(或者至少是误导性的)关于能够用'val'覆盖'def's,作者也显然对方法和函数之间的区别感到困惑。没有函数,既不是抽象的也不是在上面的代码片段中,只有方法。考虑到在Scala中方法和函数之间的区别是*基本*,这似乎是一个巨大的错误。 –

回答

3

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

使用def确定抽象属性允许执行者选择是否要使用val,vardef

所以,如果作者声称只有def可以覆盖def,这是不正确的(也许这是在早期版本的Scala?)。

+0

我从我的朋友那里读了另一本书,所以我不是100%确定我在哪里阅读它。可能这只是我犯的一个错误。感谢你的回答。 –

1

不幸的是,我从来没有读过博克(对我来说是耻辱)。但这是错误的。您可以使用vallazy val覆盖def。这种模式非常普遍。

为避免奇怪的行为,强烈建议避免摘要val