Что такое запечатанная черта?
=============================

Запечатанные классы описаны в «Программирование в Scala», но запечатанные черты - нет.
Где я могу найти больше информации о запечатанном признаке?

Я хотел бы знать, является ли запечатанная черта такой же, как у запечатанного класса?
Или, если нет, в чем различия?
Когда стоит использовать запечатанную черту (а когда нет)?

a sealed trait is the same as a sealed class ?

Так далеко как`sealed` идет, да. Они разделяют нормальные различия между`trait` а также`class`, конечно.

Or, if not, what are the differences ?

Мут.

When is it a good idea to use a sealed trait (and when not) ?

Если у тебя есть`sealed class X`тогда вы должны проверить`X` а также любые подклассы. То же самое не относится к`sealed abstract class X` или же`sealed trait X`, Так что вы могли бы сделать`sealed abstract class X`но это более многословно, чем просто`trait` и для небольшого преимущества.

Основное преимущество использования`abstract class` через`trait` в том, что он может получать параметры. Это преимущество особенно актуально при использовании классов типов. Допустим, например, что вы хотите построить отсортированное дерево. Вы можете написать это:

но вы не можете сделать это:

поскольку границы контекста (и границы представления) реализованы с неявными параметрами. Учитывая, что черты не могут получать параметры, вы не можете этого делать.

Лично я предпочитаю`sealed trait` и использовать его, если какая-то конкретная причина не заставляет меня использовать`sealed abstract class`, И я говорю не о тонких причинах, а о личных причинах, которые вы не можете игнорировать, таких как использование классов типов.



Также я чувствую необходимость указать вам спецификации:

The **sealed** modiﬁer applies to class deﬁnitions. A **sealed** class may not be directly inherited, except if the inheriting template is deﬁned in the same source
 file as the inherited class. However, subclasses of a sealed class can be inherited anywhere.

— [M. Odersky. The Scala language specification, version 2.8. online, Sept., 2013.](https://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf)



& # X200C; & # x200C; Кратко:

Sealed traits ,can only be extended in the same file
List this lets the compiler easily know all possible subtypes
Use sealed traits when the number of possibly subtypes is finite and known in advance
A way of creating something like enum in Java
Help to define algebraic data types (ADTs)

и для более подробной информации
[Все о запечатанных чертах в Scala](https://underscore.io/blog/posts/2015/06/02/everything-about-sealed.html)



`sealed` trait может быть расширен только в том же файле, что и его объявление.

Они часто используются в качестве альтернативы`enums`, Поскольку они могут быть расширены только в одном файле, компилятор знает все возможные подтипы и может рассуждать об этом.

Например, с объявлением:

Компилятор выдаст предупреждение, если совпадение не является исчерпывающим:

Таким образом, вы должны использовать запечатанные черты (или запечатанный абстрактный класс), если число возможных подтипов конечно и известно заранее. Для большего количества примеров вы можете посмотреть на[список](https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/immutable/List.scala#L76) а также[вариант](https://github.com/scala/scala/blob/v2.9.2/src/library/scala/Option.scala#L85) Реализации.



От[Ежедневно-скала блог](https://daily-scala.blogspot.com/2010/02/self-annotation-vs-inheritance.html):

When a trait is "sealed" all of its subclasses are declared within the
 same file and that makes the set of subclasses finite which allows
 certain compiler checks.