《programming in scala》2ed chap12学习笔记——trait linear

import scala.collection.mutable.ArrayBuffer

object Chap11 {

  abstract class IntQueue {
    def put(x: Int)
    def get(): Int
  }
  class BasicIntQueue extends IntQueue {
    private val buf = new ArrayBuffer[Int]
    def put(x: Int) = buf += x
    def get(): Int = buf.remove(0)
  }

  trait Doubling extends IntQueue { //有了extends IntQueue,Doubling这个trait只能mixin到extends IntQueue的类里面
    abstract override def put(x: Int) {
      super.put(x * 2)
    }
  }

  trait Incrementing extends IntQueue {
    abstract override def put(x: Int) {
      super.put(x + 1)
    }
  }

  trait Filtering extends IntQueue {
    abstract override def put(x: Int) {
      if (x >= 0)
        super.put(x)
    }
  }

  def main(args: Array[String]): Unit = {
    val dq = new BasicIntQueue with Doubling
    dq.put(1)
    println(dq.get)

    /*
     * mixin的order很重要,下面的顺序会先过滤,再+1,再*2.
     * 这是Scala的linear order,简单而言是从右到左,super指向前面的trait或者class里面的方法,
     * 用于stackable modification
     */
    val difq = new BasicIntQueue with Doubling with Incrementing with Filtering
    difq.put(0)
    difq.put(-1)
    difq.put(1)
    println(difq.get)
    println(difq.get)
    //    println(difq.get)
  }

}


你可能感兴趣的:(scala,trait)