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=
相关文章
相关标签/搜索