Mixins是用于进行类组合的特征。
abstract class A { val message: String } class B extends A { val message = "I'm an instance of class B" } trait C extends A { def loudMessage = message.toUpperCase() } class D extends B with C val d = new D d.message // I'm an instance of class B d.loudMessage // I'M AN INSTANCE OF CLASS BD类有一个父类B和一个mixin C。每个类只能有一个父类但是可以有多个mixins(分别使用关键字extends和with)。mixins和父类可能有相同的父类型。
下面是一个更有意思的示例:
abstract class AbsIterator { type T def hasNext: Boolean def next: T }上面的类有一个抽象类型T和一个标准迭代器方法。
下面,我们会实现一个具体的类(所有抽象成员T,hasNext和next都会实现):
class StringIterator(s: String) extends AbsIterator { type T = Char private var i = 0 def hasNext = i < s.length def next = { val ch = s charAt i i += 1 ch } }StringIterator有一个String并可用于遍历字符串(如,查看字符串是否包含特定字符)。
下面创建一个特征扩展AbsIterator。
trait RichIterator extends AbsIterator { def foreach(f: T => Unit): Unit = while (hasNext) f(next) }因为RichIterator是一个特征,所以不需要实现AbsIterator中的抽象成员。
将StringIterator和RichIterator的功能组合到一个类中。
object StringIteratorTest extends App { class Iter extends StringIterator(args(0)) with RichIterator val iter = new Iter iter foreach println }类Iter的父类是StringIterator,mixin是RichIterator。
单一继承无法有这样的灵活程度。