必须覆盖scala中的val变量

zjf*_*fdu 8 scala

我在scala中遇到了一个奇怪的问题.以下是我的代码,类Employee扩展类Person

但是这段代码无法编译,我已经明确地将firstName和lastName定义为val变量.这是为什么 ?这是否意味着我必须覆盖基类中的val变量?目的是什么?

class Person( firstName: String,  lastName: String) {

}

class Employee(override val firstName: String, override val lastName: String, val depart: String)
    extends Person(firstName,lastName){

} 
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 10

构造函数的输入参数不是val,除非你说它们.如果它们已经存在,为什么要覆盖它们呢?

class Person(val firstName: String, val lastName: String) {}
class Strange(
  override val firstName: String, override val lastName: String
) extends Person("John","Doe") {}
class Employee(fn: String, ln: String, val depart: String) extends Person(fn,ln) {}
Run Code Online (Sandbox Code Playgroud)

如果它们不是val并且您想要制作val,则不需要覆盖:

class Person(firstName: String, lastName: String) {}
class Employee(
  val firstName: String, val lastName: String, val depart: String
) extends Person(firstName,lastName) {}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案用一个问题回答了这个问题.我会尽力回答.您必须在`Strange`类中的`val`前面说`override`的原因是告诉编译器您不打算引入新字段.`override`意思是"在这里我声明已经在父类中声明的东西并且不打算引入一些不被继承的东西".没有"覆盖"`val`意味着"请创建一个公共的,只读字段".但是,Scala不允许两个val字段具有相同的名称.因此,"覆盖"是强制性的. (12认同)

Dir*_*irk 6

由于构造函数参数在Person中没有val/var声明,并且Person不是case类,因此参数不是Person类的成员,只是构造函数参数.编译器基本上告诉你:嘿,你说,firstName和lastName是成员,它覆盖/重新定义从基类继承的东西 - 但据我所知,没有任何东西......

class Person(val firstName: String, val lastName: String)
class Employee(fn: String, ln: String, val salary: BigDecimal) extends Person(fn, ln)
Run Code Online (Sandbox Code Playgroud)

你不需要在这里声明firstName/lastName作为覆盖,顺便说一下.简单地将值转发到基类的构造函数就可以了.