scala/sbEpOcBas3.scala
// package scalabook.ep.oc
/**
* Base definitions for the Operation-Centric approach.
* @author Christos KK Loverdos
*/
// Base data
trait BaseD[T] {def perform(op: BaseOp[T])}
// Base operation.
trait BaseOp[T] {def computeNumD(data: BaseD[T])}
// Concrete data implementation.
class NumD(val value: Int) extends BaseD[Int] {
def perform(op: BaseOp[Int]) {op.computeNumD(this)}
}
// 1st concrete operation: evaluate the data
class EvalOp extends BaseOp[Int] {
var result: Option[Int] = _
def apply(data: BaseD) = {data.perform(this); result.get }
def computeNumD(data: BaseD) {this.result = Some(data.value) }
}
// utility object for on-the-fly evaluations
object eval {def apply(data: BaseD) = new EvalOp()(data)}