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?
Répondre
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.
Merci pour l'explication. Maintenant, je suis encore plus curieux de savoir comment je vais me passer d'une méthode finale ... –
Hm ... vous avez raison ... laissez-moi vérifier cela. – axel22
(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? –
- 1. Référence au type d'une classe interne dans Scala
- 2. Comment rechercher une classe interne?
- 3. Comment transférer une classe interne?
- 4. instanciation une classe interne
- 5. Surcharger une méthode dans une sous-classe en C++
- 6. Scala: finale statique publique dans une classe
- 7. PHP surcharger une fonction d'une classe parente
- 8. Annoter une classe interne anonyme
- 9. Comment modifier une classe Java existante pour surcharger un opérateur dans Groovy?
- 10. Comment utiliser des types génériques paramétrés dans une classe interne?
- 11. Comment déclarer une ressource d'une classe interne privée dans WPF?
- 12. Comment puis-je utiliser une instance de classe interne provenant d'une autre méthode de classe interne?
- 13. Classe interne anonyme dans groovy
- 14. Une classe interne privée synthétise une classe anonyme inattendue
- 15. WPF interne: pourquoi UserControl est en train de surcharger AdjustBranchSource?
- 16. Comment refactoriser une classe interne statique en une classe de niveau supérieur dans Eclipse?
- 17. Classe interne et initialisation
- 18. classe interne AS
- 19. Compilation interne de scala. Travailler avec interactive.Global
- 20. Référence à une variable non-finale dans une classe interne
- 21. Comment remplacer les méthodes de classe interne si la classe interne est définie comme une propriété de la classe supérieure
- 22. Scala, l'importation classe
- 23. Méthode Classe interne locale
- 24. Classe interne C++ gérée?
- 25. Créer une classe générique avec constructeur interne
- 26. Est-il possible de surcharger les constructeurs en scala?
- 27. opérateur surcharger en dehors d'une classe!
- 28. Classe interne dans les pages Tapisserie
- 29. Est-il possible de surcharger une classe de modèle?
- 30. est-il possible de surcharger une classe CSS
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. –