2016-06-19 3 views
0

, пожалуйста, посмотрите на следующий код:Как не переопределить val родительского класса?

scala> sealed abstract class Person(val name: String) 
defined class Person 

scala> case class Student(id: Int, name: String) extends Person(name) 
<console>:8: error: overriding value name in class Person of type String; 
value name needs `override' modifier 
     case class Student(id: Int, name: String) extends Person(name) 
           ^

Это может быть банальный вопрос, но после поиска в Интернете в течение некоторого времени, я не был в состоянии понять, как просто передать строку, Конструктор Student будет представлен как name конструктору Person. Я не хочу ничего переоценивать. Что я делаю не так?

спасибо, что заблаговременно!

+2

Возможно, вы намереваетесь: «Запечатанная черта Person {def name: String}' вместо этого. –

ответ

2

Все параметры конструктора класса case: val s. В этом весь смысл. Грубо говоря, это то, что дает вам возможность пользоваться преимуществами футляры классы обеспечивают по сравнению с обычными классами: копирование, извлечение, сопоставление с образцом, и т.д.

Если вы хотите Student быть класс дела, вы должны отменяют name. Теоретически, вы можете избежать переопределения его, указав val другое имя: case class Student(id: Int, studentName: String) extends Person(studentName) - это работает, но просто не имеет особого смысла - в итоге у вас есть два разных члена, значения которых всегда одинаковы.

В качестве альтернативы, если существует реальная причина почему вы не хотите, чтобы переопределить name (я не могу себе представить, что один мог бы быть, но если ...), то Student не должно быть случай класса : class Student(val id: Int, name: String) extends Person(name).

+0

Первый абзац довольно вводит в заблуждение. Если бы это были правильные, не-case-классы, чьи конструкторские параметры были бы 'val' (например, 'class Student (val id: Int, val name: String)'), будут пользоваться теми же преимуществами. Они этого не делают. –

+0

@AlexeyRomanov «Мозг - это то, что дает людям возможность заниматься бессмысленными аргументами о семантике». Не могли бы вы утверждать, что это утверждение тоже «вводит в заблуждение», потому что у крыс есть мозги, но они не аргументируют семантику? :) – Dima

Смежные вопросы