2013-02-05 6 views
5

Ich mag programmatisch Werte binden, in Mixins zu einer Instanz gesendet, und ich frage mich, ob es eine unveränderliche Art und Weise, dies zu tun, dann mit einem versteckten veränderlichen Objekt. In erster Linie möchte ich dies für eine Registrierung verwenden. Mein aktueller Ansatz ist nach der Konstruktion nicht unbedingt unveränderbar, irgendwelche Vorschläge?Scala Registrierung mixin Konstruktor Ergebnisse unwandelbar

trait Numbers { 
    lazy val values = holding 
    private var holding = Set.empty[Int] 
    protected def includes(i:Int) { 
    holding += i 
    } 
} 

trait Odd extends Numbers{ 
    includes(1) 
    includes(3) 
    includes(5) 
    includes(7) 
    includes(9) 
} 

trait Even extends Numbers { 
    includes(2) 
    includes(4) 
    includes(6) 
    includes(8) 
} 

Dies gibt das Ergebnis, das ich von

val n = new Odd with Even 
println(n.values) 

Set(5, 1, 6, 9, 2, 7, 3, 8, 4) 
+0

ich diesen Ansatz umgesetzt haben hier in einem Scala Container http://higher-state.blogspot.co.uk/2013/03/scala-210 -simple-di-container.html –

Antwort

3

Wie sei Methode überwiegendes will? Anschließend können Sie das „super“ Objekt in Charakterzug Linearisierungs Referenz,

trait Numbers { 
    def holding = Vector[Int]() 
    lazy val values = holding 
} 

trait Odd extends Numbers { 
    override def holding = super.holding ++ Vector(1,3,5) 
} 

trait Even extends Numbers { 
    override def holding = super.holding ++ Vector(0,2,4) 
} 

(new Odd with Even).values // Vector(1, 3, 5, 0, 2, 4) 
(new Even with Odd).values // Vector(0, 2, 4, 1, 3, 5) 
+0

Hatte nicht an diesen Ansatz gedacht. Ideal Ich möchte mit der Ästhetik der Auflistungselemente für ein schönes DSL-Gefühl bleiben. Natürlich ist das vielleicht nicht machbar, wenn nichts anderes in den nächsten Tagen auftaucht (werde im Urlaub sein), gebe ich dir die Antwort –

+0

Es ist eine interessante Herausforderung, aber ich befürchte, dass die Aufgabe gegen den Geist der Mixin-Komposition geht , wobei die Linearisierung versucht, einen Wert aus den mehreren geerbten Merkmalen auszuwählen (anstatt sie zu verschmelzen). –