Dans Scala, comment définir un paramètre local dans le constructeur primaire d'une classe qui n'est pas un membre de données et qui, par exemple, sert uniquement à initialiser un membre de données dans la classe de base?Dans Scala, comment définissez-vous un paramètre local dans le constructeur primaire d'une classe?
Par exemple, dans le code suivant, comment pourrais-je définir correctement le paramètre b
dans le constructeur principal de classe B
afin qu'il ne génère un paramètre local temporaire et non un membre de données?
class A(var a: Int)
class B(?b?) extends A(b)
Randall, vos réponses expliquent pourquoi le compilateur Scala se plaint quand je présente une méthode inc
qui incrémente la propriété a
, mais aussi changer le nom du paramètre dans le constructeur de la classe B
pour correspondre à celle de la paramètre dans la classe A
constructeur:
class A(var a: Int)
class B(a: Int) extends A(a) {
def inc(value: Int) { this.a += value }
}
Scala sortie du compilateur:
$ scala construct.scala
construct.scala:3: error: reassignment to val
def inc(value: Int) { this.a += value }
^
one error found
Scala se plaint parce que la classe B
doit maintenant avoir une propriété privée en lecture seule a
en raison de la référence à a
dans inc
. La modification B(a: Int)
-B(var a: Int)
génère une erreur de compilateur différent:
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
Ajout override
ne fonctionne pas, soit:
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
Comment puis-je utiliser le même nom dans le paramètre dans le constructeur principal de B
comme la propriété définie dans le constructeur principal de la classe de base A
?
Randall, je vous remercie de votre réponse. Pouvez-vous s'il vous plaît fournir un exemple de votre mise en garde? –
Il n'est donc pas possible d'avoir un paramètre pour le constructeur sans que ce paramètre devienne un attribut pour l'instance? J'ai une classe qui reçoit un booléen, et l'initialisation varie en fonction de la valeur booléenne, mais je n'ai pas besoin de la valeur booléenne après la fin du constructeur. Cependant, les instances de cette classe auront toutes un attribut supplémentaire (le booléen mentionné ci-dessus) occupant de la mémoire, même lorsqu'elles ne sont pas nécessaires au-delà de l'initialisation. C'est vraiment nul, pour une langue aussi bonne que Scala. Triste :( – Ernesto
@Ernesto, oui, comme Randall l'a expliqué dans son addendum, il est possible d'avoir un paramètre constructeur local, à condition qu'aucune méthode dans la classe ne se réfère à ce paramètre.Si une telle méthode existe, Scala "promeut" le paramètre à un membre de données d'instance –