Y a-t-il un moyen d’étendre un object?

En scala, nous ne pouvons pas étendre l’ object :

 object X object Y extends X 

donne une erreur d’ error: not found: type X

Dans mon cas, quelqu’un a défini des fonctionnalités dans un object et je dois le prolonger (append une autre méthode). Quelle serait la manière la plus simple d’étendre cet object?

Comme souvent, la bonne réponse dépend des besoins réels de l’entreprise. S’étendre à partir d’un object pourrait en quelque sorte défier le but de cet object, car il ne serait plus un singleton.

Ce qui pourrait être une solution, c’est d’extraire le comportement dans un trait abstrait. Et créer des objects prolongeant ce trait comme suit:

 trait T{ // some behavior goes here } object X extends T object Y extends T { // additional stuff here } 

Si vous souhaitez utiliser des méthodes et des valeurs provenant d’un autre object, vous pouvez utiliser l’importation.

 object X{ def x = 5 } object Y{ import X._ val y = x } 

Vous ne pouvez pas réellement étendre un object, car cela en créerait deux, et un object par définition n’existe qu’une seule fois (edit: eh bien, ce n’est pas tout à fait vrai, car la définition d’object peut être dans une classe ou une méthode).

Pour vos besoins, essayez ceci:

 object X { } object Y { def a = 5 } implicit def xToY(x: X.type) = Y println(Xa) 

Il ne s’étend pas réellement, mais il vous permet d’appeler de nouvelles méthodes dessus.

La seule façon de partager du code entre deux objects est d’avoir une ou plusieurs superclasses / traits communs.

Vous pouvez convertir parent en classe + object compagnon, puis faire en sorte que l’enfant étende la classe Eg

dans Parent.scala

 class Parent {} object Parent extends Parent {} 

Et puis dans Child.scala

 object Child extends Parent {} 

Oui, c’est plus un hack qu’une solution.