un trait scellé est le même qu'une classe scellée?
En ce qui concerne sealed
, oui. Ils partagent les différences normales entre trait
et class
, bien sûr.
Ou, sinon, quelles sont les différences?
Discutable.
Quand est-ce une bonne idée d'utiliser un trait scellé (et quand non)?
Si vous en avez un sealed class X
, vous devez vérifier X
ainsi que les sous-classes. Il n'en va pas de même pour sealed abstract class X
ou sealed trait X
. Donc, vous pourriez le faire sealed abstract class X
, mais c'est beaucoup plus verbeux que juste trait
et pour peu d'avantages.
Le principal avantage d'utiliser un abstract class
sur un trait
est qu'il peut recevoir des paramètres. Cet avantage est particulièrement pertinent lors de l'utilisation de classes de types. Disons que vous voulez construire un arbre trié, par exemple. Vous pouvez écrire ceci:
sealed abstract class Tree[T : Ordering]
mais vous ne pouvez pas faire ceci:
sealed trait Tree[T : Ordering]
puisque les limites de contexte (et les limites de vue) sont implémentées avec des paramètres implicites. Étant donné que les traits ne peuvent pas recevoir de paramètres, vous ne pouvez pas le faire.
Personnellement, je préfère sealed trait
et l'utilise à moins qu'une raison particulière ne me fasse utiliser un sealed abstract class
. Et je ne parle pas de raisons subtiles, mais de raisons que vous ne pouvez pas ignorer, telles que l'utilisation de classes de types.