2010-11-19 12 views
3

Ich habe eine Eigenschaft "Foo" mit einigen Methoden. Ich möchte dieses Merkmal zu jeder Klasse mischen. Aber ich mag nicht etwas schreiben wollenHinzufügen einer spezifischen Eigenschaft zu einer Klasse zur Laufzeit

val b = new Bar with Foo 

Ich brauche so etwas wie, wo gebe ich nur eine Klasse, und es wird mit Foo gemischt. Ich möchte mit dieser Eigenschaft nur mischen, d. H. Es ist festgelegt, dass alle Klassen nur mit der Foo-Eigenschaft gemischt werden sollen.

val b = new Factory(Bar) //Factory returns instance with trait Foo 

Ich fand diese post, aber ich bin nicht überzeugt.

So etwas ist in scala möglich?

+0

Übergeben Sie in diesem Fabrikbeispiel die _type_ 'Bar' oder eine _instance_ von' Bar'? Wenn Letzteres nicht möglich ist, sind implizite Conversions in der Regel ausreichend. –

+0

als eine Art 'Bar' –

Antwort

4

Die aktuelle beste Lösung ist Foo so etwas zu implementieren:

class Foo(bar:Bar) { 
    ... 
} 
object Foo { 
    def apply(bar:Bar) = new Foo(bar) 
    implicit def backToBar = this.bar 
} 

Dann ist es wie

val foo = Foo(myBar) 

Für alle Methodennamen verwenden, die zwischen Foo und Bar, die Version in Foo geteilt werden wird verwendet (wie beim Überladen in einem Mixin). Bei allen anderen Methoden wird die Variante Bar verwendet.

Die Technik ist nicht perfekt, Methoden in Bar werden nur andere Methoden aufrufen, die in Bar definiert sind, und niemals "überladen", die in Foo definiert sind. Ansonsten ist es ziemlich nah an Ihren Bedürfnissen.

+0

Ich bin neu zu scala, aber oben Code in interaktiven Scala Shell funktioniert nicht, andere Sache Bar ist variabel dh es kann sein (Bar mit Foo) oder (Boo mit Foo), habe ich nicht bekommen über Code, was es genau macht –

Verwandte Themen