En Scala, ¿cómo se define un parámetro local en el constructor primario de una clase que no es un miembro de datos y que, por ejemplo, sirve solo para inicializar un miembro de datos en la clase base?En Scala, ¿cómo se define un parámetro local en el constructor principal de una clase?
Por ejemplo, en el siguiente código, ¿cómo podría definir correctamente el parámetro b
en el constructor primario de la clase B
para que genere solo un parámetro local temporal y no un miembro de datos?
class A(var a: Int)
class B(?b?) extends A(b)
Randall, sus respuestas explicar por qué el compilador Scala queja cuando introduzco un método inc
que incrementa la propiedad a
, sino también cambiar el nombre del parámetro en el constructor de la clase B
para que coincida con la de la parámetro en el constructor de la clase A
:
class A(var a: Int)
class B(a: Int) extends A(a) {
def inc(value: Int) { this.a += value }
}
Scala salida del compilador:
$ scala construct.scala
construct.scala:3: error: reassignment to val
def inc(value: Int) { this.a += value }
^
one error found
Scala se queja porque la clase B
ahora debe tener una, la propiedad privada de sólo lectura a
debido a la referencia a a
en inc
. Cambiando B(a: Int)
-B(var a: Int)
genera un error de compilación diferente:
construct.scala:2: error: error overriding variable a in class A of type Int;
variable a needs `override' modifier
class B(var a: Int) extends A(a) {
^
one error found
Adición override
no ayuda, ya sea:
construct.scala:2: error: error overriding variable a in class A of type Int;
variable a cannot override a mutable variable
class B(override var a: Int) extends A(a) {
^
one error found
¿Cómo puedo utilizar el mismo nombre en el parámetro en el constructor principal de B
como la propiedad definida en el constructor primario de la clase base A
?
Randall, gracias por su respuesta. ¿Puedes dar un ejemplo de tu advertencia? –
Entonces, ¿no es posible tener un parámetro para el constructor sin tener ese parámetro convertido en un atributo para la instancia? Tengo una clase que recibe un valor booleano, y la inicialización varía según el valor booleano, pero no necesito el valor booleano después de que termina el constructor. Aún así, las instancias de esta clase tendrán un atributo adicional (el booleano antes mencionado) que ocupará memoria, incluso cuando no sea necesaria después de la inicialización. Eso ciertamente apesta, para un lenguaje tan grande como Scala. Triste :( – Ernesto
@Ernesto, sí, como explicó Randall en su apéndice, es posible tener un parámetro constructor local, siempre que ningún método en la clase se refiera a ese parámetro. En el caso donde exista tal método, Scala "promueve" el parámetro para un miembro de datos de instancia. –