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混合类。
使用单一继承,我们将无法实现这种灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值