CodeToLive

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