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 | } |