我正在阅读有关特征的文章,我对一件事感到困惑。
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
}
为什么我必须在toppings
之前使用var
?它不会创建具有相同名称的新变量浇头吗?
根据我的理解,它不是覆盖浇头并创建一个新变量。如果我在它之前不使用 var,编译器会向我发出以下错误信号。
error: class Pizza needs to be abstract, since variable toppings in trait Pizza of type Int is not defined
当你定义
var toppings: Int
在没有任何赋值的情况下,您告诉编译器,希望扩展此定义的人必须有自己的toppings
定义。如果您有 Java 的经验,这与将字段定义为 abstract
相同。
如果你的目的是在父类中实际提供一个具体的实现,你必须显式地为其赋值,即使是默认值:
var toppings: Int = _
如果不将 var
关键字放在名称之前,您正在尝试访问您正在编写的类中未定义的内容,而需要首先定义抽象成员。
请注意,此答案的内容实际上适用于所有字段,无论是var
s,val
s还是lazy val
s。
因为PizzaTrait
中的toppings
没有初始化(因此是抽象的(。
要么以某种方式初始化它:
var toppings: Int = _
var toppings: Int = 0
或者在继承PizzaTrait
的类中实现它,就像你在 类Pizza
.