Est-il possible d'étendre un objet?
En scala, nous ne pouvons pas prolonger object
:
object X
object Y extends X
donne une erreur error: not found: type X
Dans mon cas, quelqu'un a défini certaines fonctionnalités dans un objet et j'ai besoin de l'étendre (essentiellement ajouter une autre méthode). Quel serait le moyen le plus facile d'étendre cet objet?
Vous devez vous connecter pour publier un commentaire.
Comme c'est souvent la bonne réponse dépend de la réelle exigence de l'entreprise. S'étendant à partir d'un objet dans un certain sens, défier le but de cet objet, car il ne serait pas un singleton plus.
Ce qui pourrait être une solution est d'extraire le comportement dans l'abstraction d'un trait. Et de créer des objets à l'extension de ce trait de caractère, comme suit:
Si vous souhaitez utiliser des méthodes et des valeurs à partir d'un autre objet, vous pouvez utiliser de l'importation.
Vous ne pouvez pas étendre un objet, parce que ce serait de créer deux, et un objet, par définition, n'existe qu'une seule fois (edit: eh bien, ce n'est pas tout à fait vrai, parce que la définition de l'objet peut être dans une classe ou une méthode).
Pour vos besoins, essayez ceci:
Il ne fait pas les étendre, mais il ne vous permet pas d'appeler à de nouvelles méthodes sur ce qu'ont été initialement définies.
X.a
, il est plus difficile de trouver ceX.a
fait référence, parce que vous avez besoin de savoir ce que implicites sont dans la portée. Au moins, c'est ce qui me frustre à ce sujet. Mais j'ai pensé que je voudrais vous suggérer de toute façon.La seule façon de partager du code entre deux objets, c'est d'avoir un ou plusieurs super-classe/trait.
class A { object a }; class B extends A { override object a }; ((new B): A).a // access B.a
Vous pouvez convertir des parents en classe + compagnon de l'objet, puis demander à l'enfant de s'étendre de la classe E. g.
dans le Parent.scala
Puis de l'Enfant.scala
Oui, c'est plus un hack qu'une solution.
Noter qu'avec
Dotty
(fondation deScala 3
), vous pouvez également utiliser la composition (au lieu de l'héritage) via l'exportation des clauses qui permettent de définir des alias pour les membres sélectionnés de l'objet:Notez que vous pouvez également limiter le nombre de membres que vous souhaitez exporter: