Geek Quizz VI: jouons avec les portées
Le thème semble simple, pourtant cherchez l'erreur dans le code suivant. L'exercice est plus amusant si vous n'utilisez pas l'aide du compilateur bien évidemment.
J'attends vos suggestions.
class Outer
{
static void F(long l) { }
static void F(string s) { }
class Inner
{
void G()
{
F(1);
F("Hello");
}
static void F(long l) { }
}
}
Désolé pour les dates de posts erronées mais je suis aux US (business + vacances pour les curieux :p).
Mitsu
[Update] Quizz suivant: Geek Quizz VII: toujours les portées !
Comments
Anonymous
August 09, 2007
C'est sur F("Hello"); je pense, il me semble pas que tu es accès direct au membres statiques de la classe Outer.Anonymous
August 09, 2007
Désolé, mais si, une inner class accède à la portée statique de la classe qui la définit. MitsuAnonymous
August 09, 2007
Bon bah ca doit etre la ligne du dessus alors, il doit couiner parce qu'il sait pas qui appeler (Inner.F(long) ou Outter.F(long))^^Anonymous
August 09, 2007
Je pensais comme toi, mais en vérifiant on se rend compte qu'on est loin de la réponse!Anonymous
August 09, 2007
L'accès statique existe, mais est-il pour autant implicite ? Moi je pense que le compilateur ne va pas jusqu'à Outer.F(string) tout seul et donc qu'il se rabat sur Inner.F(long).... et pour F("Hello"), forcément, ça ne doit pas passer.Anonymous
August 09, 2007
Sauf erreur de ma part, le fait d'avoir définit une méthode F dans la classe Inner empêche l'accès implicite aux méthodes F de Outer. Du coup, il ne connais plus que static void F(long l). Donc le compilo doit gueuler sur F("Hello");. Il faudra donc appeler explicitement le F de Outer : F(1); Outer.F("Hello"); En revanche si Inner n'avait pas défini de méthode F, pas de problème.Anonymous
August 09, 2007
Petite précision. Sauf erreur de ma part, l'accès implicite aux méthodes de Outer via Inner n'est possible que sur les méthodes statiques (ça semble d'ailleurs bien normal).Anonymous
August 10, 2007
Bon, c'est bien un problème de portée mais la vraie réponse n'est pas encore là... Dans cet exemple, F("Hello") plante. Pourtant si je mets en commentaire la méthode F() de l'inner class, tout fonctionne ! Donc toutes les syntaxes de portée qu'elles soient implicites ou explicites sont correctes. Le pb est ailleurs.Anonymous
August 10, 2007
"Pourtant si je mets en commentaire la méthode F() de l'inner class, tout fonctionne !" C'est ce que j'ai dit : "En revanche si Inner n'avait pas défini de méthode F, pas de problème." C'est "le fait d'avoir défini une méthode F dans la classe Inner [qui] empêche l'accès implicite aux méthodes F de Outer". C'est pas ça ?Anonymous
August 10, 2007
The comment has been removedAnonymous
August 10, 2007
Vous y êtes presque mais ce n'est pas tout à fait ça. Dans l'exemple suivant c'est facile. Le i de la méthode Toto() masque la donnée membre. class Test { int i = 0; void Toto() { int i = 1; } } Voici la règle pour les méthodes: lorsqu'une méthode d'une inner class masque une méthode de la classe outer (car la portée en plus proche), alors elle masque toutes les méthodes du même nom et donc tous les occurences de méthodes overloadées. Ainsi Inner.F() masque toutes les méthodes F() de Outer. Cette règle s'applique aux méthodes qu'elles soient statiques ou non.Anonymous
August 10, 2007
Est-ce réellement une règle où un pb lié au compilateur ?Anonymous
August 10, 2007
C'est une règleAnonymous
August 16, 2007
Celui-ci est plus simple que les autres, donc attention: question de rapidité ! Dans l'exemple suivant,Anonymous
August 29, 2007
The comment has been removedAnonymous
August 29, 2007
Erratum : Il faut appeler Outer.F("Hello")