scala學習:特質Trait

特質 Trait

Trait可堆疊特性

可自由組合你的算法,很是靈活。越靠後的特質越先執行。算法

特質使用的線性化解讀superide

abstract class IntQueue {
      def get(): Int

      def put(x: Int)
    }

    class BasicIntQueue extends IntQueue {

      private val buf = new ArrayBuffer[Int]()

      override def get(): Int = buf.remove(0)

      override def put(x: Int): Unit = buf += x
    }

    trait Doubling extends IntQueue {
      abstract override def put(x: Int): Unit = super.put(2 * x)
    }

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

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


    val myqueue1 = new BasicIntQueue with Doubling with Filtering with Increming
    myqueue1.put(1)
    println(myqueue1.get())

    val myqueue2 = new BasicIntQueue with Increming with Filtering with Doubling
    myqueue2.put(1)
    println(myqueue2.get())

    val myQueue = new BasicIntQueue with Doubling with Increming with Filtering
    myQueue.put(-1)
    println(myQueue.get())

要特質仍是不要?

  • 若是某個行爲不會被複用
    用具體的類
  • 若是某個行爲可能被用於多個互不相關的類
    用特質,只有特質才能被混入類繼承關係中位於不一樣組成部分的類
  • 若是想從Java代碼中繼承某個行爲
    用抽象類
  • 上述問題都考慮以後,仍然沒有答案試試特質吧
相關文章
相關標籤/搜索