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