Необходимо переопределить переменную val в scala - PullRequest
8 голосов
/ 03 июня 2011

У меня странная проблема в скале.Ниже приведен мой код, класс 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 ]

10 голосов
/ 03 июня 2011

Входные параметры для конструктора не являются значениями, если вы не говорите, что это так.И если они уже есть, зачем их переопределять?

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) {}

Если они не являются vals и вы хотите сделать vals, вам не нужно переопределять:

class Person(firstName: String, lastName: String) {}
class Employee(
  val firstName: String, val lastName: String, val depart: String
) extends Person(firstName,lastName) {}
6 голосов
/ 03 июня 2011

Поскольку аргументы конструктора не имеют объявления val / var в Person, а поскольку 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 голосов
/ 03 июня 2011

Вы также можете подумать о том, чтобы как можно лучше изменить свои суперклассы. Пример:

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
0 голосов
/ 03 июня 2011

Если я не понял вашего намерения, вот как продлить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...