前章:タプル
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次章:[[]]