Je veux faire quelque chose comme ceci: mais le compilateur ne l'aime pas. p> Ajout de remplacement sur UpdateCount ne fonctionne pas non plus. Quel est le moyen propre de faire cela? P> p>
4 Réponses :
Vous n'avez pas besoin de déclarer le ceci s'étend également aux classes avec var code> dans la signature du constructeur de sous-classe: val code> s Dans leurs constructeurs également: P> scala> class C(val i: Int)
defined class C
scala> class D(j: Int) extends C(j)
defined class D
Cela ne fonctionne pas. Si j'utilise l'exemple exact que j'ai fourni, supprimez le var de UpdateCount, je reçois (fragment of extend.scala): 7: Erreur: réaffectation à VAL UpdateCount = UpdateCount + 1 Sortez de la méthode Inc.
Vous aurez juste besoin de renommer les paramètres de la classe B: Utiliser updateCounttin code> dans la signature du constructeur et appelez au constructeur de classe A; Vous serez toujours en mesure d'accéder à updateCount code> dans le constructeur / corps de la classe B.
Vous devez éviter d'avoir l'identifiant déclaré pour et, à la manière, déposez le B code> ombrage de l'identifiant déclaré pour A code>. Le moyen le plus simple de faire est de choisir un nom différent. Si, toutefois, vous ne voulez vraiment pas faire cela, voici une alternative: var code> de b Déclaration. P> p>
WOW, c'est un travail tout autour. Cela semble être une étrange limitation de la langue. Si j'avais un graphique héritablement 5 profondément, aurais-je besoin de continuer à proposer des "faux" noms pour ces arguments? UpdatEcountDontubeS1, et dans sa sous-classe UpdateCountDontDontDonTyTonTyTDonTyTDonTyTonTyTonTyTonTyTDonTyTDonTyTDonTDonTyTDonTDonTDonTyTDonTDonTyTDonTDonTyTDonTyTDonTeDontDonTeDontDonTonTyTDonTyTDonTDonTDonTeDontDontDontDontDontDontDontDontDonTonTonTonTonTonTonTonTonSa Ce n'est pas juste le nom ... c'est le cruft aussi. C'est un domaine supplémentaire qui est assis dans ma classe, mendiant quelqu'un à l'utiliser et obtenir de mauvais résultats.
C'est la chose ... Les paramètres de la classe ne sont pas vraiment des champs, sauf exactement avec Val code> ou var code>. Si vous ne les utilisez pas, mais le constructeur, ils ne seront pas stockés comme champs de la classe.
Lorsque vous utilisez le mot-clé code> var code> dans les paramètres, la valeur est transmise à une nouvelle est correct. P> Cependant, SCALA facilite les paramètres du constructeur directement disponibles pour les méthodes de la classe (je ne sais pas pourquoi) Donc, si vous utilisez le même nom, vous constaterez que votre code ne parvient pas à compiler avec la réaffectation d'erreur var code> dans la classe. Lorsque vous ne le faites pas, cela en fait un paramètre de constructeur (uniquement), et vous utilisez la valeur de son var code> en le transmettant au constructeur. Donc l'exemple que les gens ont donné à VAL code> lorsque vous essayez de réaffecter le "var". Par exemple, dans l'extrait suivant, les ombres du paramètre de constructeur immuable le paramètre de constructeur immuable est héritée var code> et de sorte que vous ne pouvez pas attribuer au paramètre. P> class B (val name: String, updateCount: Int) extends A(updateCount) {
def inc(): Unit = {
updateCount = updateCount + 1
}
}
Classe B (VAL Nom: String, UpdateCount: INT) prolonge A (UpdateCount) ne compilera pas pour moi. Je reçois (fragment of extension.scala): 7: Erreur: réaffectation à VAL UpdateCount = UpdateCount + 1
La première version compile. La deuxième version ne fonctionne intentionnellement et démontre le problème de l'utilisation du même nom pour le VAR et le paramètre Constructor.
Comme d'autres personnes mentionnent, votre constructeur param en B est une observation de la version de SuperClass. Voici le code qui fonctionne et ne nécessite pas de type autonome:
Un couple de personnes ont souligné que je devrais supprimer le Var de l'UpdateCount à B. Cela ne fonctionne pas. Si vous essayez, vous devriez obtenir (fragment of extend.scala): 7: Erreur: réaffectation à VAL UpdateCount = UpdateCount + 1 Sorti de la méthode Inc.