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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top