scala> //#266
scala> abstract class DoubleQueue {
| def get(): Double
| def put(no: Double)
| }
defined class DoubleQueue
scala>
scala> //////////////////////////////////////////////////
scala> // ArrayDoubleQueue : An Implementation for the
scala> // abstract class
scala> //////////////////////////////////////////////////
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> class ArrayDoubleQueue extends DoubleQueue {
| private val store = new ArrayBuffer[Double]
| def get():Double = store.remove(0)
| def put(no: Double) = { store += no }
| }
defined class ArrayDoubleQueue
scala>
scala> //////////////////////////////////////////////////
scala> // Increment : One of the stackable trait
scala> //////////////////////////////////////////////////
scala> trait Increment extends DoubleQueue {
| abstract override def put(no: Double) = {
| super.put(no + 1)
| }
| }
defined trait Increment
scala>
scala> //////////////////////////////////////////////////
scala> // Filter : One of the stackable trait
scala> //////////////////////////////////////////////////
scala> trait Filter extends DoubleQueue {
| abstract override def put(no: Double) = {
| if (no > 0) {
| super.put(no)
| }
| }
| }
defined trait Filter
scala>
scala> //////////////////////////////////////////////////
scala> // Example 1 : Using Stackable Traits
scala> //////////////////////////////////////////////////
scala> val q1 = new ArrayDoubleQueue with Filter with Increment
q1: ArrayDoubleQueue with Filter with Increment = $anon$1@6788f9cb
scala> q1.put(0)
scala> q1.put(2)
scala> q1.get()
res121: Double = 1.0
scala> q1.get()
res122: Double = 3.0
scala>
scala> //////////////////////////////////////////////////
scala> // Example 2 : Using Stackable Traits
scala> //////////////////////////////////////////////////
scala> class CustomQueue extends ArrayDoubleQueue with Increment with Filter
defined class CustomQueue
scala> val q1 = new CustomQueue()
q1: CustomQueue = CustomQueue@6424c975
scala> q1.put(0)
scala> q1.put(5)
scala> q1.get()
res125: Double = 6.0
scala> q1.get()
java.lang.IndexOutOfBoundsException: 0
at scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:43)
PS : When deciding on
Trait or
Abstract Class, if we could not decide which one too chose ; it is recommended / best practice to start with
Trait #275