2011-06-03 16 views
7

Me encuentro con un problema raro en scala. Siguiente es mi código, clase Empleado extiende clase PersonaDebe anular la variable val en scala

Pero este fragmento de código no se puede compilar, tengo define explícita firstName y lastName como variable val. Porqué es eso ? ¿Significa que tengo que anular la variable val en la clase base? ¿Y cuál es el propósito?

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

} 

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

} 

Respuesta

10

Los parámetros de entrada para el constructor no son vals a menos que diga que sí lo son. Y si ya lo están, ¿por qué anularlos?

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

Si no están Vals y que quieren hacer Vals, que no es necesario para anular:

class Person(firstName: String, lastName: String) {} 
class Employee(
    val firstName: String, val lastName: String, val depart: String 
) extends Person(firstName,lastName) {} 
+10

esta pregunta responde a la pregunta con otra pregunta. Lo cual intentaré responder. La razón por la que tienes que decir 'anular' delante de 'val' en la clase' Extraño 'es decirle al compilador que no tienes la intención de introducir un nuevo campo. 'override' significa aproximadamente" aquí estoy declarando algo que ya está declarado en la clase principal y no pretendo introducir algo que no se herede ". Sin el "reemplazo" 'val' significa" crea un campo público, de solo lectura ". Sin embargo, Scala no permite que dos campos val tengan el mismo nombre. Por lo tanto, la 'anulación' es obligatoria. –

+0

@ TheodoreNorvell - Se suponía que mi punto era que no hay razón para crear la anulación si solo vas a extender la clase original con los mismos campos. Simplemente páselos como parámetros y deje que los vals de la superclase sean vals. –

+0

@RexKerr Ok, ese es un buen punto. Usted estaba preguntando, "¿por qué el' override val'? "; Estaba respondiendo, "¿por qué tiene el 'override' dado que tiene el' val'? ". En el código que estoy escribiendo, tuve una situación similar, pero, en mi caso, la subclase es una clase de caso y, por lo tanto, el parámetro constructor es automáticamente un val. En este caso, el compilador da un mensaje de error a menos que la palabra clave 'override' esté allí y, presumiblemente por razones sintácticas, también requiere la palabra clave 'val'. Las únicas desventajas son estas dos palabras adicionales y que el campo se inicializa dos veces. –

0

A menos que yo he entendido bien su intención, aquí es cómo extender 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 
6

Dado que los argumentos del constructor tienen ninguna declaración val/var en la persona, y la persona que hay una clase caso, los argumentos no serán miembros de la clase Persona, simplemente argumentos de constructor. El compilador le está diciendo esencialmente: bueno, usted ha dicho, que el nombre y apellido son miembros, los cuales anulación/redefinir algo heredado de una clase base - pero no hay nada por lo que yo puedo decir ...

class Person(val firstName: String, val lastName: String) 
class Employee(fn: String, ln: String, val salary: BigDecimal) extends Person(fn, ln) 

No necesita declarar firstName/lastName como sustituciones aquí, por cierto. Simplemente reenviar los valores al constructor de la clase base hará el truco.

1

También puede considerar el rediseño de su super clases como rasgos tanto como sea posible. Ejemplo:

trait Person { 
    def firstName: String 
    def lastName: String 
} 

class Employee(
    val firstName: String, 
    val lastName: String, 
    val department: String 
) extends Person 

o incluso

trait Employee extends Person { 
    def department: String 
} 

class SimpleEmployee(
    val firstName: String, 
    val lastName: String, 
    val department: String 
) extends Employee 
Cuestiones relacionadas