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 B
D
类有一个父类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
。
单一继承无法有这样的灵活程度。