为什么在覆盖抽象特征字段时需要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
} 

为什么我必须在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 .

最新更新