Scala基础教程7 -- 与MIXINS的类组成
程序员文章站
2022-06-14 17:14:37
...
7 与MIXINS的类组成
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
println(d.message) // I'm an instance of class B
println(d.loudMessage) // I'M AN INSTANCE OF CLASS B
现在让我们看一个从抽象类开始的更有趣的例子:
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并且可以用来遍历String(例如,查看String是否包含某个字符)。
现在让我们创建一个也extends AbsIterator的特质。
trait RichIterator extends AbsIterator {
def foreach(f: T => Unit): Unit = while (hasNext) f(next())
}
只要有更多的元素(),这个特性foreach通过f: T => Unit在下一个元素(next())上不断调用提供的函数来实现while (hasNext)。因为RichIterator是一个特质,所以它不需要实现AbsIterator的抽象成员。
我们要结合StringIterator和RichIterator 的功能并成一个类。
object StringIteratorTest extends App {
class RichStringIter extends StringIterator("Scala") with RichIterator
val richStringIter = new RichStringIter
richStringIter foreach println
}
新类RichStringIter具有StringIterator超类和RichIterator混合类。
使用单一继承,我们将无法实现这种灵活性。
上一篇: Scala模式匹配 match case
下一篇: InnoDB的锁机制浅析