MISE À JOUR : Cette question a été le sujet de mon blog le 13 novembre 2012 . Merci pour cette excellente question !
Pourquoi, en C#, n'est-il pas permis aux classes dérivées d'avoir une plus grande accessibilité que leur classe de base ?
En plus des autres bonnes réponses, considérez ce scénario. Vous et votre collègue Alice travaillez sur des parties différentes du même assemblage. Alice écrit un cours :
public class ComplicatedClass
{
public void DoDangerousThing() { ... }
}
Vous écrivez ensuite
public class EvenMoreComplicatedClass : ComplicatedClass
{
}
Grandes. Maintenant, Alice obtient un examen de sécurité de Bob, et ils réalisent que (1) aucun client n'a jamais eu besoin d'utiliser ComplicatedClass, et (2) DoDangerousThing expose une faille de sécurité dont un code hostile pourrait tirer parti. Le code interne, bien sûr, ne le fait pas.
Alice modifie donc son code en
internal class ComplicatedClass
{
public void DoDangerousThing() { ... }
}
Il n'est pas nécessaire de remplacer "public" par "interne" dans la méthode car, bien entendu, "public" signifie "public pour les choses qui peuvent voir cette classe" et, à présent, aucun code externe ne peut voir cette classe.
Que devrait-il arriver à votre code lorsque Alice le recompilera en tenant compte de cette modification ? La compilation devrait échouer . Vous avez supposé que les utilisateurs ont besoin de voir la classe de base, et Alice a apporté une modification qui va à l'encontre de cette supposition. La chose sûre à faire est que le compilateur dise à Alice qu'elle doit venir vous parler afin que vous puissiez résoudre ce problème sans exposer le client à la vulnérabilité de DoDangerousThing.
Pourquoi est-il autorisé en Java ?
Aucune idée, désolé.