7.經過混入(mixin)來組合類

當某個特質被用於組合類時,被稱爲混入。ide

  •  

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 Dprintln(d.message) // I'm an instance of class Bprintln(d.loudMessage) // I'M AN INSTANCE OF CLASS B函數

類D有一個父類B和一個混入C。一個類只能有一個父類可是能夠有多個混入(分別使用關鍵字extend和with)。混入和某個父類可能有相同的父類。如今,讓咱們看一個更有趣的例子,其中使用了抽象類:
  •  
abstract class AbsIterator {  type T  def hasNext: Boolean  def next(): T}

該類中有一個抽象的類型T和標準的迭代器方法。接下來,咱們將實現一個具體的類(全部的抽象成員T、hasNext和next都會被實現):
  •  
abstract class AbsIterator { type T def hasNext: Boolean def next(): T}

StringIterator帶有一個String類型參數的構造器,可用於對字符串進行迭代。(例如查看一個字符串是否包含某個字符):如今咱們建立一個特質,也繼承於AbsIterator。
  •  
trait RichIterator extends AbsIterator { def foreach(f: T => Unit): Unit = while (hasNext) f(next())}

該特質實現了foreach方法——只要還有元素能夠迭代(while (hasNext)),就會一直對下個元素(next()) 調用傳入的函數f: T => Unit。由於RichIterator是個特質,能夠沒必要實現AbsIterator中的抽象成員。下面咱們要把StringIterator和RichIterator 中的功能組合成一個類。
  •  
object StringIteratorTest extends App { class RichStringIter extends StringIterator("Scala") with RichIterator val richStringIter = new RichStringIter richStringIter foreach println}

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
相關文章
相關標籤/搜索