Alasca: Traits, Sealed Traits and Enum Traits
Published on 2018-08-31.
Traits
- traits are interfaces with implementations (and type classes (todo))
trait Name
fun name: String
- traits can have constructor fields:
trait Age(age: Int32)
Sealed Traits
@sealed
requires that all classes/values/modules of a trait are defined in the trait’s companion module:
@sealed
trait Car(expensive: Boolean)
fun model: String
module Car
module NoCar extends Car
fun model: String = "none"
class Jaguar(model: String) extends Car(true)
value Nissan(model: String) extends Car(true)
Enum Traits
- an
@enum
trait is more restrictive than a sealed trait: it can only contain modules
module Friend
module Joe extends Age(23), Friend
module Joanna extends Age(42), Friend
module John extends Age(17), Friend
@enum
trait Friend
- in return, an enum value receives some helper methods by default:
Friends.values == ImmutableArray(Joe, Joanna, John)
Friends.withName("Joe") == Friends.Joe
Set[Friend](...) // implementation uses a bit field