scala/ScalaBook/chapter-03/mixinB.scala
class Person {
var name = "Mitsos"
var _height: Int = 180
def hasItem(key:Int): Boolean =
if (key == 1)
true
else
false
def height = _height
}
trait _Block {
def canOpen(p: Person) = false
def canPass(p: Person) = false
}
trait Door extends _Block {
override def canOpen(p: Person) : Boolean =
return true
override def canPass(p: Person) : Boolean =
return true
}
trait LockedDoor extends _Block { this: Door =>
override def canOpen(p: Person): Boolean = {
if (!p.hasItem(theKey)) {
println("You don't have the Key")
return false
}
println("Using key...")
return super.canOpen(p)
}
}
trait ShortDoor extends _Block { this: Door =>
override def canPass(p: Person): Boolean = {
if (p.height > 180) {
println("You are too tall")
return false
}
println("Ducking into door...")
return super.canPass(p)
}
}
class LockedShortDoor extends Door
with LockedDoor with ShortDoor
val theKey = 2
val door = new LockedShortDoor
val μήτσος = new Person
door canOpen μήτσος
door canPass μήτσος