To explain my question:
Class : Toy
Trait1: Speak like Male
Trait2: Speak like Female
Can I change the behavior (traits) of Toy during runtime so
Scala really doesn't do that. There's Kevin Wright's autoproxy plugin which can do it, and you can instantiate and object with either trait, without that trait being part of the base class.
I personally think that trying to accomplish things that way is to go against the grain of Scala: hard and prone to getting stuck. It is better to design a solution that doesn't require such things -- in fact, Scala grain tends much more to the functional, which put focus on everything being immutable, and replacing one object with a new one as a result of computation.
sealed trait Speaker
case object Male extends Speaker
case object Female extends Speaker
class Toy(name: String, speaks: Speaker = Male) {
def speak = speaks match {
case Male => "ugh"
case Female => "What time do you call this?"
}
}
Then
barbie = ken.copy(speaks = Female)
You cannot change the trait
s which an object extends at runtime, because a trait
is mixed in to create a class (in a .class file). A given object has exactly one class and this can never be changed.