Depuis le mélange des caractères se fait de manière statique en Scala, si vous voulez varier les traits mixtes à un objet, de créer différents objets en fonction de certaines conditions.
Prenons un canoniques modèle de gâteau exemple. Vos modules sont définis comme des traits, et votre application est construite comme un simple Objet avec un tas de fonctionnalités mixte dans
val application =
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup
Désormais, tous ces modules ont une belle auto-déclarations de type qui définissent leurs inter-dépendances de modules, de sorte que la ligne ne compile si votre tous les inter-dépendances des modules existent, sont uniques, et bien typé. En particulier, le module de Persistance a un auto-type qui dit que tout ce que la mise en œuvre de la Persévérance doit également mettre en œuvre la source de données, un résumé du module de trait. Depuis ProductionDataSource hérite de la source de données, tout est grand, et que l'application de la construction de la ligne de compile.
Mais que faire si vous souhaitez utiliser une autre source de données, en soulignant certains locaux de la base de données à des fins de test? De plus, supposons que vous ne pouvez pas réutiliser ProductionDataSource avec différents paramètres de configuration, chargé de certaines propriétés de fichier. Ce que vous feriez dans ce cas est de définir un nouveau trait TestDataSource qui s'étend de la source de données, et le mélanger à la place. Vous pouvez même le faire de façon dynamique en fonction d'une option de ligne de commande.
val application = if (test)
new Object
extends Communications
with Parsing
with Persistence
with Logging
with TestDataSource
else
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup
Maintenant, qui ressemble un peu plus verbeux que nous l'aimerions, en particulier si votre application a besoin de faire varier sa construction sur plusieurs axes. Sur le côté positif, vous vous avez seulement un morceau de construction conditionnelle, la logique comme ça dans une application (ou au pire une fois par identifiables composante du cycle de vie), donc au moins la douleur est réduite au minimum et clôturé de le reste de votre logique.