首页 文章

必须覆盖scala中的val变量

提问于
浏览
8

我在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){

}

4 回答

  • 6

    构造函数的输入参数不是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) {}
    
  • 10

    由于构造函数参数在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作为覆盖,顺便说一下 . 简单地将值转发到基类的构造函数就可以了 .

  • 0

    您也可以考虑尽可能多地将超类重新设计为特征 . 例:

    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
    
  • 1

    除非我've misunderstood your intention, here' s如何扩展 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
    

相关问题