Supposons que j'ai le code suivant: lorsque je mélange dans TRAIT1 code> et
TRAIT2 code>, en référence à
intérieure semble être par défaut au type code> intérieure code> de quel type je mixage secondaire; Donc, lorsque j'appelle
obj code> 's
MAIN code> méthode IT imprime
inner2 code>. Comment puis-je vous référer à
TRAIT1.INNER CODE> IN
FOO code>? Toutes les trois des erreurs suivantes donnent à Compiler: P>
class Concrete1 extends Trait1.Inner
class Concrete1 extends Trait1$Inner
class Concrete1 extends Trait1#Inner
4 Réponses :
Pourquoi ne pas commander les traits dans l'ordre, vous vous attendez à ce qu'ils ont la priorité? La linéarisation des traits n'est pas arbitraire, mais spécifiée. P>
Oui, je pensais faire ça. Mais supposons que je souhaite créer un Concrete2 étend également TRAIT2.INNER. Quoi alors?
Il existe deux espaces de noms dans un modèle (modèle étant le corps d'une classe, d'un objet ou d'un trait.) p>
Lors de l'hérité de plusieurs modèles parents, les conflits dans ces espaces de noms sont résolus par la linéarisation de la classe. P>
Vous pouvez commander votre héritage pour apporter le parent souhaité dans votre classe ou trouver une conception alternative. P>
Merci, cela ne m'a pas eu pour moi que des traits membres seraient remplacés. A du sens quand on y pense!
une option (si vous pouvez être invasif pour les traits) consiste à définir chaque trait intérieur en tant que membre de type qui a un nom non conflictuel.
trait Trait1 { trait Inner { val name = "Inner1" } } trait Trait2 { trait Inner { val name = "Inner2" } } trait FooIntermediate extends Trait1 { class Concrete1 extends Inner } class Foo extends FooIntermediate with Trait2 { class Concrete2 extends Inner val c1 = new Concrete1 val c2 = new Concrete2 }
Merci, je pensais faire de type Inner1 = intérieur. Je n'avais pas pensé à vos deux autres options cependant; Maintenant, j'ai trop de choix :)
au lieu de Utilisez ce p> qui devrait vous obtenir ce que vous voulez p> p> P>
C'est génial, je peux maintenant écrire la classe Concrete1 étend Super [Trait1] .inner et la classe Concrete2 étend Super [Trait2] .inner et avoir des instances des deux types d'intérieur à FOO.