2012-09-17 22 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