351 votes

Qu'est-ce qu'un trait scellé?

Les classes scellées sont décrites dans 'Programming in Scala', mais les traits scellés ne le sont pas. Où puis-je trouver plus d'informations sur un trait scellé?

Je voudrais savoir, si un trait scellé est la même chose qu'une classe scellée? Ou, sinon, quelles sont les différences? Quand est-ce une bonne idée d'utiliser un trait scellé (et quand pas)?

499voto

paradigmatic Points 20871

Un sealed trait peut être prolongé que dans le même fichier que sa déclaration.

Ils sont souvent utilisés pour fournir une alternative à l' enums. Car ils peuvent seulement être étendue dans un seul fichier, le compilateur sait tous les sous-types et la raison peut-elle à ce sujet.

Par exemple, avec la déclaration:

sealed trait Answer
case object Yes extends Answer
case object No extends Answer

Le compilateur émet un avertissement si un match n'est pas exhaustive:

scala> val x: Answer = Yes
x: Answer = Yes

scala> x match {
     |   case No => println("No")
     | }
<console>:12: warning: match is not exhaustive!
missing combination            Yes

Si vous devez utiliser des scellés traits (ou scellé classe abstraite) si le nombre de sous-types est fini et connu à l'avance. Pour plus d'exemples, vous pouvez jeter un oeil à la liste et de l'option de mise en œuvre.

93voto

Daniel C. Sobral Points 159554

un scellé trait est le même qu'une classe scellée ?

Aussi loin que l' sealed va, oui. Ils partagent la normale différences entre trait et class, bien sûr.

Ou, si non, quelles sont les différences ?

Moot.

Quand est-ce une bonne idée d'utiliser un scellé trait (et quand) ?

Si vous avez un sealed class X,, alors vous devez vérifier pour X ainsi que toutes les sous-classes. Ce n'est pas vrai de sealed abstract class X ou sealed trait X. Si on pouvait faire de l' sealed abstract class X, mais c'est beaucoup plus détaillé que juste trait et pour peu d'avantages.

Le principal avantage de l'utilisation d'un abstract class sur un trait , c'est qu'il peut recevoir des paramètres. Cet avantage est particulièrement pertinent lors de l'utilisation de classes de type. Disons que vous voulez construire une triés arbre, par exemple. Vous pouvez écrire ceci:

sealed abstract class Tree[T : Ordering]

mais vous ne pouvez pas faire ceci:

sealed trait Tree[T : Ordering]

depuis le contexte des limites (et à la vue de limites) sont mis en œuvre avec les paramètres implicites. Étant donné que les traits ne peuvent pas recevoir des paramètres, vous ne pouvez pas le faire.

Personnellement, je préfère sealed trait et de l'utiliser, sauf si une raison particulière me fait utiliser un sealed abstract class. Et je ne parle pas de subtiles raisons, mais dans-votre-visage raisons vous ne pouvez pas ignorer, comme l'utilisation de classes de type.

57voto

Brian Agnew Points 143181

Depuis le blog quotidien de scala :

Quand un trait est "scellé", toutes ses sous-classes sont déclarées dans le même fichier et cela rend l'ensemble des sous-classes fini, ce qui permet certaines vérifications du compilateur.

30voto

A T Points 1483

Aussi, je ressens le besoin de vous pour le cahier des charges:

Le scellé modificateur s'applique à des définitions de classe. Un scellé de classe ne peut pas être directement héritée, sauf si l'héritage de template est défini de la même source le fichier de la classe héritée. Cependant, les sous-classes d'une classe scellée peut être héréditaire, n'importe où.

- M. Odersky. La Scala spécification du langage, de la version 2.8. en ligne, Sept., 2013.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X