View difference between Paste ID: JMFaVnjv and 66rgvt9d
SHOW: | | - or go back to the newest paste.
1
// ---------Framework:---------
2
3
abstract class Engine {
4-
	abstract type MixIn
4+
	class Base(val children: Seq[Base])
5-
	// add members to this base class which are defined only in the subclass
5+
6-
	class Base(val children: Seq[Base]) extends MixIn
6+
7
	final class Spec1(val foo: String, children: Seq[Base]) extends Base(children)
8
	final class Spec2(val bar: String, children: Seq[Base]) extends Base(children)
9
}
10
11
object Engine {
12
	def runExample(engine: Engine) {
13
		val spec1 = new engine.Spec1("foo", Seq.empty)
14
		engine.doSomething(spec1)
15
		val spec2 = new engine.Spec2("foo", Seq(new Spec1("foo", Seq.empty)))
16
		engine.doSomething(spec2)
17
	}
18
}
19
20
// ---------Client:---------
21
22
class ConcreteEngine {
23
	override class Base(val children: Seq[Base]) {
24
		val height = if(children.isEmpty()) 0 else children.map{_.height}.max
25-
	trait Height {
25+
26
	override def doSomething(base: Base) {
27
		println("Node @ " + base.height)
28-
	override type MixIn = Height
28+
29
}
30
31
object Main extends App {
32
	Engine.run(new ConcreteEngine())
33
}