scala/epDc1.scala
// Base data
trait BaseD {
def eval: Int
def allT = (this, eval)
def allS = this.toString + " =eval=> " + eval
}
class NumD(val value: Int) extends BaseD {
def eval() = value
}
val nD = new NumD(12)
// extension with DataSubClass Plus
class PlusD(val l: BaseD, val r: BaseD) extends BaseD {
def eval() = l.eval + r.eval
}
(nD, nD eval)
nD.allT
nD.allS
new PlusD(nD, new NumD(98)) allS
new PlusD(new PlusD(nD, new NumD(34)), new NumD(98)) allS
// extension mit Mixin traits
trait BaseS extends BaseD {
def repr: String
def allR = (this, eval, repr)
override def allS = super.allS + " =repr=> " + repr
}
class NumS(value: Int) extends NumD(value) with BaseS {
def repr() = value.toString
}
class PlusS(l: BaseS, r: BaseS) extends PlusD(l ,r) with BaseS {
def repr() = '(' + l.repr + '+' + r.repr + ')'
}
val nS = new NumS(57)
(nS, nS eval, nS repr)
nS.allT
nS.allR
nS.allS
new PlusS(nS, new NumS(98)) allS
new PlusS(new PlusS(new NumS(12), new NumS(34)), new NumS(98)) allS
// aber nD funktioniert nicht
// nD.repr ==> error: value repr is not a member of NumD
// new PlusS(nD, new NumS(98)) eval ==> error: type mismatch; found : NumD required: BaseS