我正在阅读有关特征的内容,我对一件事感到困惑。
trait PizzaTrait {
var toppings: Int
var size = 14
var maxToppings = 14
}
class Pizza extends PizzaTrait{
var toppings = 0 // need to use var keyword here
size = 16 // not required
}
为什么我必须在var
之前使用toppings
?不会创建具有相同名称的新变量配料吗?
根据我的理解,它不会覆盖浇头并创建新变量。如果我之前没有使用var,编译器就会发出以下错误信号。
error: class Pizza needs to be abstract, since variable toppings in trait Pizza of type Int is not defined
答案 0 :(得分:4)
定义时
var toppings: Int
没有任何类型的赋值,您告诉编译器,任何希望扩展此定义的人都必须拥有自己的toppings
定义。如果您有使用Java的经验,则将该字段定义为abstract
。
如果您的目的是在父类中实际提供具体实现,则必须为其明确赋值,即使是默认:
var toppings: Int = _
如果不在名称前加上var
关键字,那么您正在尝试访问您正在编写的类上未定义的内容,而需要首先定义抽象成员。
请注意,此答案的内容实际上适用于所有字段,包括var
,val
或lazy val
s。
答案 1 :(得分:2)
因为toppings
中的PizzaTrait
未初始化(因此是抽象的)。
以某种方式初始化它:
var toppings: Int = _
var toppings: Int = 0
或者在继承PizzaTrait
的类中实现它,就像你一样
班Pizza
。