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