为什么在覆盖特征的抽象字段时需要var?

时间:2018-01-16 08:19:51

标签: 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之前使用toppings?不会创建具有相同名称的新变量配料吗?

根据我的理解,它不会覆盖浇头并创建新变量。如果我之前没有使用var,编译器就会发出以下错误信号。

error: class Pizza needs to be abstract, since variable toppings in trait Pizza of type Int is not defined

2 个答案:

答案 0 :(得分:4)

定义时

var toppings: Int

没有任何类型的赋值,您告诉编译器,任何希望扩展此定义的人都必须拥有自己的toppings定义。如果您有使用Java的经验,则将该字段定义为abstract

如果您的目的是在父类中实际提供具体实现,则必须为其明确赋值,即使是默认

var toppings: Int = _

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

请注意,此答案的内容实际上适用于所有字段,包括varvallazy val s。

答案 1 :(得分:2)

因为toppings中的PizzaTrait未初始化(因此是抽象的)。

以某种方式初始化它:

var toppings: Int = _
var toppings: Int = 0

或者在继承PizzaTrait的类中实现它,就像你一样  班Pizza