Acabo de tropezar con alguna situación que me parece extraña. Puede ser que me esté perdiendo lo obvio aquí, de todos modos, por favor, ayúdenme.¿Los argumentos del constructor Scala están duplicados?
Considérese la siguiente secuencia de comandos Scala repl:
scala> class X(val s: String) { def run=println("(X): "+s) }
defined class X
scala> class Y(s: String) extends X("MY "+s) { override def run=println("(Y): "+s) }
defined class Y
scala> new Y("fish").run
(Y): fish
En el guión que estoy definiendo una clase X con un atributo de clase "val s". Luego defino una clase Y que se supone que toma un argumento de constructor y lo pasa a X- lo cual hace. Para mostrar la diferencia, modifico "s" antes de darle a X ("MY" + s).
Finalmente creo una nueva Y y llamo "ejecutar". Esto imprime "pez" a la consola, así que obviamente el atributo "s" de la clase "X" ha sido sombreado por un nuevo atributo "s" que he creado en "Y".
Intenté esto con Scala 2.8 y 2.9.1 con el mismo resultado.
¿Se supone que es así? ¿Qué debo hacer si solo quiero pasar los argumentos del constructor de mi clase a una superclase y no quiero almacenar el parámetro yo mismo dentro de la clase secundaria? ¿Cuál es la práctica común aquí?
Gracias!
¡Gracias por la explicación detallada! –
El parámetro de clase s en Y sombrea los valores definidos en X. – mkneissl