Saturday, September 24, 2016

Using Stackable Traits : Example...

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