1. 程式人生 > >Scala基礎教程7 -- 與MIXINS的類組成

Scala基礎教程7 -- 與MIXINS的類組成

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混合類。 使用單一繼承,我們將無法實現這種靈活性。