Un temps d'exécution existants objet dans la JVM a une certaine taille sur le tas. L'ajout d'un trait serait en modifiant sa taille sur le tas, et la modification de sa signature.
Donc, la seule façon de procéder serait de faire une sorte de transformation au moment de la compilation.
Composition Mixin en Scala se produit au moment de la compilation. Quel compilateur pourrait potentiellement faire est de créer un wrapper B autour d'un objet existant avec le même type que le fait de simplement renvoyer tous les appels à l'objet existant, puis les mélanger dans un trait T de B. Ceci, cependant, n'est pas mis en œuvre. Il est douteux, lorsque cela serait possible, puisque l'objet A peut être une instance d'une classe final, qui ne peut pas être prolongé.
En résumé, mixin composition n'est pas possible aux instances de l'objet.
Mise à JOUR:
Liés à la smart solution proposée par Googol Shan, et en généralisant, il fonctionne avec n'importe quel trait de caractère, c'est ce que je suis. L'idée est d'extraire la commune mixin fonctionnalité dans l' DynamicMixinCompanion
trait. Le client doit alors créer un compagnon objet s'étendant DynamicMixinCompanion
pour chaque trait, il veut avoir la dynamique mixin fonctionnalité pour. Ce compagnon de l'objet nécessite de définir les anonymes trait de l'objet est créé (::
).
trait DynamicMixinCompanion[TT] {
implicit def baseObject[OT](o: Mixin[OT]): OT = o.obj
def ::[OT](o: OT): Mixin[OT] with TT
class Mixin[OT] protected[DynamicMixinCompanion](val obj: OT)
}
trait OtherTrait {
def traitOperation = println("any trait")
}
object OtherTrait extends DynamicMixinCompanion[OtherTrait] {
def ::[T](o: T) = new Mixin(o) with OtherTrait
}
object Main {
def main(args: Array[String]) {
val a = "some string"
val m = a :: OtherTrait
m.traitOperation
println(m.length)
}
}