Traits and Enums
A trait is a contract specifying what bindings an implementing class must provide. A class implements a trait with : TraitName and marks the overriding members with override:
trait Faculty {
let firstName : string
let lastName : string
let age : i32
let sayHello()
}
class Teacher(
override firstName: string,
override lastName: string,
override age: int
) : Faculty {
override sayHello() {
print("Hello ${firstName} ${lastName}. I am a teacher.")
}
}
Enums
Enums describe a fixed set of related values, where each case can carry its own data. match is the idiomatic way to branch on which case you have:
trait Person
enum People : Person {
# object represents a single instance member of the enumeration.
object Unnamed(let name = "unknown"),
class Teacher(override name : string),
class Student(override name : string)
}
let process(person: People) {
match(person) {
People.Teacher -> println("Teacher: ${person.name}")
People.Student -> println("Student: ${person.name}")
else -> raise RuntimeException("Unhandled person type")
}
}