2011-09-28 79 views
11

我想更好地瞭解斯卡拉,而我似乎無法找到類似於下面的代碼有效的用例:在Scala中擴展匿名類型的目的是什麼?

class C extends { def m() { /* ... */ } } 

什麼是允許這樣的構造的原理是什麼?

謝謝!

+2

您提供的示例不是結構類型,而是匿名類。這並不是說它解釋了爲什麼你可以擴展它... –

+0

你是對的,我更新了標題 – Eyvind

回答

12

我想這裏的唯一理由是「如果可能,避免特殊情況」。你可以擴展任何類,一個匿名類是一個類,所以你可以擴展一個匿名類。

+0

你可能是對的(+1)。但是,如果確實存在的話,會愛一個實際的用例:) – Eyvind

+1

我不認爲有一個... –

+0

我同意金,繼承允許共享行爲或表示給定的層次結構。但是,如果父類是匿名的,則不能有兩個子類擴展相同的父類。 – paradigmatic

11

事實上,這不是一個匿名類!它是一個早期的初始化器,它作爲超類之前構造函數的一部分運行。 從another stackoverflow question引述出色答卷:

abstract class X { 
    val name: String 
    val size = name.size 
} 

class Y extends { 
    val name = "class Y" 
} with X 

如果代碼是不是寫爲

class Z extends X { 
    val name = "class Z" 
} 

然後當Z得到初始化將發生一個空指針異常,因爲大小在正常名前初始化初始化的排序(上課之前的超類)。

相關問題