Comment peut-on « passer outre » une classe interne à Scala?
-
30-09-2019 - |
Question
Dans la Scaladoc de classe Enumeration # Val, je peux lire: « Une classe qui implémente le type Valeur Cette classe peut être surchargée pour modifier le comportement d'identification de nom et entier de l'énumération. ». Je suis perplexe: comment puis-je passer outre une classe? ne sont pas autorisés choses comme override class Val extends super.Val
.
La solution
Il n'y a pas de classes virtuelles à Scala (encore), vous ne pouvez pas override class Val ...
écrire, et assurez-vous que l'invocation new Val
choisira dynamiquement la bonne classe pour la nouvelle instance. Que se passerait-il est au contraire que la classe serait choisie en fonction du type de la référence à l'instance de la classe englobante (dans ce cas, Enumeration
).
L'astuce générale à imiter les classes virtuelles est d'écrire class Val extends super.Val
, puis remplacer une méthode protégée qui sert d'usine pour les instances de la classe. Dans ce cas, vous devrez également remplacer la méthode:
protected def Value(i: Int, name: String): Value = new Val(i, name)
Enumeration
va créer des instances de Val
uniquement en utilisant cette méthode d'usine. En général, ce modèle exige de la discipline de la part du programmeur, mais peut être assurée en déclarant les constructeurs privés, ce qui oblige le programmeur à utiliser la méthode de l'usine.