2017-07-21 1 views
0

La méthode la plus simple consiste à spécifier la déclaration this dans les corps de classes externes afin de définir un nom unique pour chaque classe. Mais je voudrais écrire l'accès sans modifier les classes externes.Est-il possible d'accéder à des classes externes anonymes?

Exemple de code:

trait Test { 
    def z = new Test { 
    val a = 1 
    def y = new Test { 
     val a = false 
     def x = new Test { 
     val b = 2 * a 
     } 
    } 
    } 
} 

Je voudrais accéder outer.outer.a au lieu de simplement outer.a lors de la définition val b

Comment puis-je spécifier this d'une classe anonyme? Si c'était Named, je pourrais écrire Named.this, mais les classes anonymes n'ont pas de noms.

Répondre

0

Ceci peut être réalisé avec self types:

trait Test { greatGrandparent => 
    def z = new Test { grandparent => 
    val a = 1 
    def y = new Test { parent => 
     val a = false 
     def x = new Test { 
     val b = 2 * grandparent.a 
     } 
    } 
    } 
} 
+0

Je ne pouvais pas modifier les classes de parents, ils sont donnés. Je ne pouvais pas lire l'auto-référence à partir du symbole, car il est déjà effacé. D'où la question: comment faire référence à la classe parente sans compter sur la fonction self-type, comme je l'ai mentionné dans la toute première question abstract – ayvango

+0

La référence pour 'greatGrandparent' est le seul endroit où la classe parente est ajustée. Je suppose que je ne comprends pas assez la question - pour 'grandParent' et' parent', les types d'auto devraient être bien. – Andy

+0

vous ne pouviez pas modifier les classes externes, vous ne pouviez pas leur ajouter d'auto-types. Ils pourraient déjà avoir des références auto ombrées par une variable dans une méthode. J'ai besoin d'un moyen robuste de référencer greatgrandparent sans faire d'autres hypothèses comme la disponibilité de référence automatique – ayvango