欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 with