2010-12-02 31 views
9

Dans le Scaladoc de la classe Enumeration # Val, je peux lire: "Une classe implémentant le type Value, cette classe peut être surchargée pour changer le comportement de nommage et d'identification d'entier de l'énumération." Je suis perplexe: comment puis-je remplacer un cours? Des choses comme override class Val extends super.Val ne sont pas autorisées.Comment "surcharger" une classe interne dans Scala?

+0

Il est possible de définir une classe interne, par ex. dans un objet 'MyEnum extends Enumeration' comme suit:' class Val (i: Int, nom: String) étend super.Val (i, nom) ', mais il ne surcharge pratiquement pas l'énumération # Val car il n'est pas instancié à tout. –

Répondre

12

Il n'existe aucune classe virtuelle dans Scala (pour l'instant), vous ne pouvez donc pas écrire override class Val ..., puis assurez-vous qu'appeler new Val choisira dynamiquement la bonne classe pour la nouvelle instance. Ce qui se passerait à la place, c'est 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 pour émuler des classes virtuelles est d'écrire class Val extends super.Val, puis de surcharger 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 nécessite une discipline de la part du programmeur, mais peut être assuré en déclarant les constructeurs privés, forçant le programmeur à utiliser la méthode d'usine.

+0

Merci pour l'explication. Maintenant, je suis encore plus curieux de savoir comment je vais me passer d'une méthode finale ... –

+0

Hm ... vous avez raison ... laissez-moi vérifier cela. – axel22

+0

(Juste comme une explication pour les autres lecteurs: la méthode que vous mentionnez est en fait finale dans Enumeration.scala.) En passant, vous avez écrit "Il n'y a pas de classes virtuelles dans Scala (encore)". Toute preuve que cela pourrait venir dans le futur? –