запечатана ознака така ж, як і герметичний клас?
Що стосується sealed
, так. Вони поділяють нормальні відмінності між собою trait
і class
, звичайно.
Або, якщо ні, які відмінності?
Суперечка.
Коли корисно використовувати запечатану ознаку (а коли ні)?
Якщо у вас є sealed class X
, то вам доведеться перевірити, X
як і будь-які підкласи. Те саме не стосується sealed abstract class X
або sealed trait X
. Так ви могли б зробити sealed abstract class X
, але це набагато більш багатослівно, ніж просто trait
і з невеликою перевагою.
Основна перевага використання abstract class
над a trait
є те, що він може приймати параметри. Ця перевага особливо актуальна при використанні класів типів. Скажімо, ви хочете, наприклад, побудувати сортоване дерево. Ви можете написати це:
sealed abstract class Tree[T : Ordering]
але ви не можете цього зробити:
sealed trait Tree[T : Ordering]
оскільки межі контексту (і межі перегляду) реалізуються з неявними параметрами. Зважаючи на те, що ознаки не можуть отримувати параметри, ви не можете цього зробити.
Особисто я віддаю перевагу sealed trait
і користуюся ним, якщо з якоїсь конкретної причини не змушують мене використовувати sealed abstract class
. І я не говорю про тонкі причини, але про особисті причини, які ви не можете ігнорувати, як-от використання типів класів.