Scala基礎教程7 -- 與MIXINS的類組成
阿新 • • 發佈:2018-12-19
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混合類。 使用單一繼承,我們將無法實現這種靈活性。