APPENDIX C: Introduction to Scala 431
Traits
Say you want to add another class to your vehicle hierarchy. This time you want to add a batmobile.
A batmobile can race, glide, and fly. But you cannot add glide and fly methods to the Vehicle class
because in a nonfictional world, Car and Bike do not glide or fly. Not yet at least. So, if you want to
add Batmobile to your vehicle hierarchy, you can use a trait. Traits are like interfaces in Java that can
also contain code. In Scala, when a class inherits from a trait, it implements the interface of the trait
and inherits all the code contained in the trait. Listing C-13 shows flying and gliding traits.
Listing C-13. Scala Traits
trait flying {
def fly() = println("flying")
}
trait gliding {
def gliding() = println("gliding")
}
Now you can create the Batmobile class that extends Vehicle class along with the flying and
gliding traits, as shown in Listing C-14.
Listing C-14. Using Traits
- Batmobile(speed : Int) extends Vehicle(speed) with flying with gliding{
- override val mph: Int = speed
- override def race() = println("Racing Batmobile")
- override def fly() = println("Flying Batmobile")
- override def glide() = println("Gliding Batmobile")
- }
You can now create a batmobile in the REPL, as illustrated here:
scala> val vehicle3 = new Batmobile(300)
vehicle3: Batmobile = Batmobile@374ed5
Now you can access the fly() method of Batmobile, as illustrated here:
scala> vehicle3.fly()
Flying Batmobile
Create a list of vehicles, and then you can use the maxBy() method provided by the Scala collections
library to find the fastest vehicle in the list.