为什么在覆盖特征的抽象字段时需要 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 中未定义的内容,而抽象成员需要先定义。
请注意,此答案的内容实际上适用于所有字段,无论是 var
s、val
s 还是 lazy val
s。
因为 PizzaTrait
中的 toppings
未初始化(因此是抽象的)。
要么以某种方式初始化它:
var toppings: Int = _
var toppings: Int = 0
或者在继承 PizzaTrait
的 class 中实现它,就像您在
class Pizza
.
我正在阅读有关特质的文章,但我对一件事感到困惑。
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 中未定义的内容,而抽象成员需要先定义。
请注意,此答案的内容实际上适用于所有字段,无论是 var
s、val
s 还是 lazy val
s。
因为 PizzaTrait
中的 toppings
未初始化(因此是抽象的)。
要么以某种方式初始化它:
var toppings: Int = _
var toppings: Int = 0
或者在继承 PizzaTrait
的 class 中实现它,就像您在
class Pizza
.