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