Geek Quizz VII: toujours les portées !


Ben oui ce n’est pas si simple ces histoires de portée.
Une méthode peut être redéfinie par une classe enfant grâce au mot clé “new” (voir la classe Derived).


Dans cet exemple, quelle est la méthode F() appellée par la méthode G() ?


class Base
{
public static void F() {}
}
class Derived: Base
{
new private static void F() {}
}
class MoreDerived: Derived
{
static void G() { F(); }
}

Mitsu


[Update] Quizz suivant: Geek Quizz VIII: vous avez dit static ?

Comments (4)

  1. Tetranos says:

    De mémoire, le mot clé new sert à dire au compilo que l’on a conscience que la méthode que l’on ajoute masque la méthode de la classe mère.

    Dans cet exemple, étant donné que dans Derived la méthode F est privée, je pense que c’est Base.F qui est appelée.

    Une chance sur deux…

  2. Danuz says:

    En dépit du fait que la méthode F aie été redéfinie en private, Je pense moi que c’est Derived.F qui est appelée. La méthode appelée par défaut dans G n’est pas celle du Parent de MoreDerived ?

  3. mitsu says:

    C’est en effet Base.F() qui est appelé.

    Que voulais-je montrer dans cet exemple ?

    Il est possible de mixer deux notions de portée différente:

    – masquer une méthode (new).

    – la portée public/protected/private au travers de l’héritage.

    Dans notre exemple la classe Derived masque la méthode F() mais uniquement dans sa propre portée locale.

    Ainsi, dans la classe MoreDerived Derived.F() n’est pas accessible ce qui est normal car de visibilité private mais on remarque que du coup Base.F() survit à la redéfinition privée de Derived et est bien accessible dans la portée locale de MoreDerived !

  4. Le thème semble simple, pourtant cherchez l’erreur dans le code suivant. L’exercice est plus amusant