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

Why var is required while overriding abstract field of trait?

我正在阅读有关特质的文章,但我对一件事感到困惑。

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?它不会创建同名的新变量toppings吗?

按照我的理解,不是覆盖toppings,创建一个新的变量。如果我不在它之前使用 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.

相同

如果您的意图是在父 class 中实际提供一个具体的实现,您必须明确地为其分配一个值,即使是 default :

var toppings: Int = _

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

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

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

要么以某种方式初始化它:

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

或者在继承 PizzaTrait 的 class 中实现它,就像您在 class Pizza.