前章:タプル


  • AbsIteratorを継承したトレイトを定義すると、そのトレイトはAbsIterator にのみ依存し、抽象メンバは具象クラスが実装するため、StringIterator以外(将来のIntIteratorなど)にもミックスインでき、再利用も可能であり。その他、拡張したい振る舞いがある場合も抽象クラスや具象クラスを改変せずに振る舞いを追加可能である
abstract class AbsIterator:
  type T
  def hasNext: Boolean
  def next(): T
 
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
 
trait RichIterator extends AbsIterator:
  def foreach(f: T => Unit): Unit = while hasNext do f(next())
 
class RichStringIter extends StringIterator("Scala"), RichIterator
val richStringIter = RichStringIter()
richStringIter.foreach(println)
// S
// c
// a
// l
// a

次章:[[]]