当某个特质被用于组合类时,被称为混入。
1 | abstract class A { |
类D
有一个父类B
和一个混入C
。一个类只能有一个父类但是可以有多个混入(分别使用关键字extend
和with
)。混入和某个父类可能有相同的父类。
现在,让我们看一个更有趣的例子,其中使用了抽象类:
1 | abstract class AbsIterator { |
该类中一个抽象的类型T
和标准的迭代器方法。
接下来,我们将实现一个具体的类(所有的抽象成员T
、hasNext
和next
都会被实现):
1 | class StringIterator(s: String) extends AbsIterator { |
StringIterator
带有一个String
类型参数的构造器,可用于对字符串进行迭代。(例如查看一个字符串是否包含某个字符):
现在我们创建一个特质,也继承于AbsIterator
。
1 | trait RichIterator extends AbsIterator { |
该特质实现了foreach
方法——只要还有元素可以迭代(while (hasNext)
),就会一直对下个元素(next()
) 调用传入的函数f: T => Unit
。因为RichIterator
是个特质,可以不必实现AbsIterator
中的抽象成员。
下面我们要把StringIterator
和RichIterator
中的功能组合成一个类。
1 | object StringIteratorTest extends App { |
新的类RichStringIter
有一个父类StringIterator
和一个混入RichIterator
。如果是单一继承,我们将不会达到这样的灵活性。