Scala Traits & Mixins
Understand Scala's trait system and mixin composition.
Basic Trait
trait Greeter {
def greet(name: String): Unit =
println(s"Hello, $name!")
}
class DefaultGreeter extends Greeter
val greeter = new DefaultGreeter
greeter.greet("Alice") // Hello, Alice!
Multiple Traits
trait Speaker {
def speak(): Unit = println("Speaking...")
}
trait Walker {
def walk(): Unit = println("Walking...")
}
class Person extends Speaker with Walker
val person = new Person
person.speak()
person.walk()
Abstract Traits
trait Animal {
def sound: String // abstract method
def makeSound(): Unit = println(sound)
}
class Dog extends Animal {
def sound: String = "Woof!"
}
Stackable Modifications
abstract class IntQueue {
def get(): Int
def put(x: Int): Unit
}
trait Doubling extends IntQueue {
abstract override def put(x: Int): Unit =
super.put(2 * x)
}
class BasicQueue extends IntQueue {
private val buf = new scala.collection.mutable.ArrayBuffer[Int]
def get() = buf.remove(0)
def put(x: Int) = buf += x
}
val queue = new BasicQueue with Doubling
queue.put(10) // Actually puts 20
Self Types
trait User {
def username: String
}
trait Tweeter {
this: User => // self type
def tweet(tweetText: String): Unit =
println(s"$username: $tweetText")
}
class VerifiedUser(val username: String) extends User with Tweeter
val user = new VerifiedUser("Alice")
user.tweet("Hello Scala!") // Alice: Hello Scala!
← Back to Tutorials