scalaプログラミング-特質スタック可能な変更に使用


特質の重要な使い方の一つは、痩せたインターフェースを太ったインターフェースに変えることです.
2つ目の主な使い方は、クラスにスタック可能な変更を提供することです.特質は、これらの変更をスタックすることで、クラスの方法を変更することができます.
栗を挙げます.
整数キューのスタック変更
キューには2つの操作があります.put、整数をキューに入れ、get、末尾から取り出します.
キューは先に出るので、getは整数でキューに入る順番に取り出すべきです.
クラスがこのようなキューを実装すると、次のような変更を実行する特質を定義できます.
Doubling:キューに入れたすべての数字を倍にする
Incrementing:対塁に入れたすべてのデジタル付加価値
Filtering:負の数をキューからフィルタ
この3つの特質は、新しいキュークラスを定義するのではなく、元のキューのクラスの動作を変更したため、変更を表します.この3つも同じように積み重ねられます
//   IntQueue
abstract class IntQueue{
	def get():Int
	def put(x:Int)
}
//   ArrayBuffer IntQueue  
import scala.collection.mutable.ArrayBuffer

class BasicIntQueue extends IntQueue{
	private val buf = new ArrayBuffer[Int]
	def get() = buf.remove(0)
	def put(x:Int) {buf += x}
}
val queue = new BasicIntQueue
println(queue)
queue.put(10)
queue.put(20)
println(queue.get)
println(queue.get)
//Doubling         IntQueue.                IntQueue  
trait Doubling extends IntQueue{
	abstract override def put(x: Int) {super.put(2 * x)}
}
//                   super   。               ,
//             。        ,           。      super   
//      ,  Doubling super     ,            ,     
//        
//
//                          ,           ,          abstract override   ,                     
class MyQueue extends BasicIntQueue with Doubling
val myqueue = new MyQueue
myqueue.put(30)
println(myqueue.get)