2011-09-28 100 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得到初始化将发生一个空指针异常,因为大小在正常名前初始化初始化的排序(上课之前的超类)。

相关问题