Scala 为什么在重写trait的抽象字段时需要var?

Scala 为什么在重写trait的抽象字段时需要var?,scala,traits,Scala,Traits,我正在读关于性格的书,我对一件事感到困惑 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?它不会用相同的名称

我正在读关于性格的书,我对一件事感到困惑

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
?它不会用相同的名称创建新的可变浇头吗

根据我的理解,它不是覆盖浇头和创建新变量。如果在此之前未使用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
关键字放在名称之前,您将尝试访问您正在编写的类中未定义的内容,而需要首先定义抽象成员

请注意,此答案的内容实际上适用于所有字段,无论是
var
s、
val
s还是
lazy val
s。

<

var toppings: Int
在没有任何赋值的情况下,您会告诉编译器,任何想要扩展此定义的人都必须有自己的
toppings
定义。如果您有Java方面的经验,这与将字段定义为
abstract
是一样的

如果您的意图是在父类中实际提供一个具体的实现,那么您必须显式地为它赋值,即使是默认值:

如果不将
var
关键字放在名称之前,您将尝试访问您正在编写的类中未定义的内容,而需要首先定义抽象成员


请注意,此答案的内容实际上适用于所有字段,无论是
var
s、
val
s还是
lazy val
s。

因为
pizzatracit
中的
浇头
未初始化(因此是抽象的)

以某种方式初始化它:

var toppings: Int = _
var toppings: Int = 0
或者在继承PizzaTrait的类中实现它,就像在
比萨饼

,因为
比萨饼特性
中的
配料
未初始化(因此是抽象的)

以某种方式初始化它:

var toppings: Int = _
var toppings: Int = 0
或者在继承PizzaTrait的类中实现它,就像在
Pizza

在scala中,
var
是不受欢迎的,更重要的是,公众成员我知道,我很好奇它为什么会这样做?
toppings
是抽象的<代码>大小不可用。因此,派生的
将继承
大小
,但在派生的
创建它之前,
顶部
并不存在。在scala中,
var
是不受鼓励的,因为公众成员知道,我很好奇它为什么会这样做?
顶部
是抽象的<代码>大小不可用。因此,派生的
将继承
大小
,但
顶部
在派生的
创建之前不存在。请在回答中添加解决方案详细信息请在回答中添加解决方案详细信息