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