Pourquoi le compilateur envoie-t-il un message d'erreur lorsque vous réduisez la visibilité d'une méthode tout en la surchargeant dans la sous-classe?
Réponses
Trop de publicités?Parce que chaque instance de la sous-classe doit toujours être une instance valide de la classe de base (voir Principe de substitution de Liskov ).
Si la sous-classe a soudainement perdu une propriété de la classe de base (à savoir une méthode publique par exemple), elle ne constituerait plus un substitut valide pour la classe de base.
Parce que si cela était autorisé, la situation suivante serait possible:
Classe Sous hérite de la classe Parent. Parent a une méthode publique foo
, Sous fait que la méthode privée. Maintenant, le code suivant devrait compiler amende, parce que le type déclaré de l' bar
est Parent:
Parent bar = new Sub();
bar.foo();
Cependant, il n'est pas clair comment cela devrait se comporter. Une possibilité serait de laisser il provoque une erreur d'exécution. Une autre serait de tout simplement le permettent, ce qui en ferait-il possible d'appeler une méthode privée de l'extérieur, juste par la coulée de la classe parent. Aucune de ces solutions de rechange sont acceptables, de sorte qu'il n'est pas permis.