By now you must have guessed that in Scala, things are far simpler. Let's try the following commands with creating an object:
object MovieStrategy extends App { type MoviePref = () => String // 1 abstract class FamilyMember { def name: String def moviePref: MoviePref } case class Mom(name: String, moviePref: MoviePref) extends FamilyMember case class Dad(name: String, moviePref: MoviePref) extends FamilyMember case class Kid(name: String, moviePref: MoviePref) extends FamilyMember def letUsGoForAMovie[T <: FamilyMember](familyMember: T) = { // 2 val mp = s"${familyMember.name} : ${familyMember .moviePref() } " println(mp) } val mom = Mom("Mom", () => "some romantic flick") // 3 val dad = Dad("Dad", () => "Action! Guns! Chase") val kid = Kid("Kid", () => "Animation for me") letUsGoForAMovie(mom) // 4 letUsGoForAMovie(dad) letUsGoForAMovie(kid) }
It is just a pageful.