我在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){
}
答案 0 :(得分: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) {}
如果它们不是val并且您想要制作val,则不需要覆盖:
class Person(firstName: String, lastName: String) {}
class Employee(
val firstName: String, val lastName: String, val depart: String
) extends Person(firstName,lastName) {}
答案 1 :(得分: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)
你不需要在这里声明firstName / lastName作为覆盖,顺便说一下。只需将值转发给基类的构造函数即可。
答案 2 :(得分:2)
您也可以考虑尽可能多地将超类重新设计为特征。例如:
trait Person {
def firstName: String
def lastName: String
}
class Employee(
val firstName: String,
val lastName: String,
val department: String
) extends Person
甚至
trait Employee extends Person {
def department: String
}
class SimpleEmployee(
val firstName: String,
val lastName: String,
val department: String
) extends Employee
答案 3 :(得分:0)
除非我误解了你的意图,否则以下是如何延长Person
。
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class Person( firstName: String, lastName: String)
defined class Person
scala> class Employee(firstName: String, lastName: String, depart: String) extends Person(firstName, lastName)
defined class Employee