Trait就像一个拥有部分实现的接口,它提供了一个介于单一继承和多重继承的中间地带,因为我们可以在其他类里面混入(mix in)它们。这样就可以用一组特性对类进行增强。
示例:
abstract class Writer {
def writeMessage(message: String)
}
trait UpperCaseWriter extends Writer {
abstract override def writeMessage(message: String): Unit = {
super.writeMessage(message.toUpperCase())
}
}
trait ProfanityFilteredWriter extends Writer {
abstract override def writeMessage(message: String): Unit = {
super.writeMessage(message.replace("stupid", "s-----"))
}
}
class StringWriterDelegate extends Writer {
val writer = new java.io.StringWriter
override def writeMessage(message: String) = writer.write(message)
override def toString() = writer.toString()
}
调用:
val myWriterProfanityFirst =
new StringWriterDelegate
with UpperCaseWriter
with ProfanityFilteredWriter
val myWriterProfanityLast =
new StringWriterDelegate
with ProfanityFilteredWriter
with UpperCaseWriter
myWriterProfanityFirst.writeMessage("There is no sin except stupidity")
myWriterProfanityLast.writeMessage("There is no sin except stupidity")
println(myWriterProfanityFirst)
println(myWriterProfanityLast)
结果:
THERE IS NO SIN EXCEPT S-----ITY
THERE IS NO SIN EXCEPT STUPIDITY