Запечатанные трейты
Закрытые иерархии
«Запечатанные трейты» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
What Is a Trait?
A trait is like an interface: it declares a common type that other classes can extend.
Traits let you group related types under one umbrella so they can be used interchangeably.
A Basic Trait
Declare a trait with trait, then have classes or objects extends it.
trait Shape
case class Circle(r: Double) extends Shape
case class Square(side: Double) extends Shape
object Main {
def main(args: Array[String]): Unit = {
val s: Shape = Circle(2.0)
println(s)
}
}What Does sealed Mean?
A sealed trait can only be extended by types declared in the same file.
This closes the hierarchy: the compiler knows the complete list of possible subtypes.
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def main(args: Array[String]): Unit = {
val c: Color = Green
println(c)
}
}Case Objects as Variants
When a variant has no data, use case object instead of case class. There is only ever one instance.
This is perfect for enum-like values.
sealed trait Direction
case object North extends Direction
case object South extends Direction
object Main {
def main(args: Array[String]): Unit = {
val d: Direction = North
println(d)
}
}Mixing Objects and Classes
A sealed trait can have both case object variants (no data) and case class variants (with data).
sealed trait Event
case object Started extends Event
case class Failed(reason: String) extends Event
object Main {
def main(args: Array[String]): Unit = {
val e: Event = Failed("timeout")
println(e)
}
}Matching on a Sealed Trait
You match on the trait and handle each variant. Because the hierarchy is sealed, the compiler can verify you covered them all.
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def hex(c: Color): String = c match {
case Red => "#FF0000"
case Green => "#00FF00"
case Blue => "#0000FF"
}
def main(args: Array[String]): Unit = {
println(hex(Green))
}
}Compiler Warnings
If you forget a variant in a match over a sealed trait, the compiler warns you about the missing case.
This catches bugs when you later add a new variant. We will explore this fully in the exhaustive matching lesson.
Traits Can Declare Members
A trait can declare methods or fields that all subtypes share or must implement.
sealed trait Animal {
def sound: String
}
case object Dog extends Animal { def sound = "Woof" }
case object Cat extends Animal { def sound = "Meow" }
object Main {
def main(args: Array[String]): Unit = {
println(Dog.sound)
println(Cat.sound)
}
}Why Sealed?
Sealing a trait gives you:
- A known, closed set of subtypes
- Exhaustiveness checking in
match - Safer refactoring when adding variants
Sealed traits plus case classes are how Scala builds algebraic data types.
Using the Hierarchy
Functions can accept the trait type and work with any variant, dispatching via pattern matching.
sealed trait Payment
case class Cash(amount: Int) extends Payment
case class Card(number: String) extends Payment
object Main {
def summary(p: Payment): String = p match {
case Cash(a) => s"cash $a"
case Card(n) => s"card ending ${n.takeRight(4)}"
}
def main(args: Array[String]): Unit = {
println(summary(Cash(50)))
println(summary(Card("123456789012")))
}
}Putting It Together
A sealed trait with mixed variants, shared via a function that matches each case.
sealed trait Result
case object Pending extends Result
case class Success(value: Int) extends Result
case class Error(msg: String) extends Result
object Main {
def show(r: Result): String = r match {
case Pending => "waiting"
case Success(v) => s"ok: $v"
case Error(m) => s"fail: $m"
}
def main(args: Array[String]): Unit = {
List(Pending, Success(7), Error("boom")).foreach(r => println(show(r)))
}
}Quick Check
Test your understanding of sealed traits.
Recap
You learned about sealed traits:
- A
traitdefines a shared supertype sealedlimits subtypes to the same file- Use
case objectfor data-less variants,case classfor variants with data - Sealing enables exhaustiveness checking in
match
Часто задаваемые вопросы
Урок «Запечатанные трейты» бесплатный?
Да — полный текст урока «Запечатанные трейты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Запечатанные трейты»?
Закрытые иерархии Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Запечатанные трейты»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Классы case
- Запечатанные трейты
- Алгебраические типы данных
- Полное сопоставление