class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Ce code compile en C# et l'équivalent fonctionne en PHP, mais quelqu'un peut-il expliquer la raison pour laquelle otherTestClass._privateString
peut être changé ici?Pourquoi une variable de membre privé peut-elle être modifiée par instance de classe?
J'aurais pensé qu'une instance d'une classe ne devrait en aucun cas pouvoir changer une variable membre privée, et qu'essayer d'accéder à otherTestClass._privateString
donnerait une erreur 'inaccessible en raison d'un niveau de protection'.
Ceci n'est cependant pas le cas, alors pourquoi l'instanciation d'un objet dans sa propre classe vous permet-elle d'accéder aux membres privés? Et devrait-il, cela ne rompt pas l'encapsulation dans une certaine mesure? Ou est-ce que je manque quelque chose d'évident?
- (Je ne demande pas si la conception de classe ci-dessus est une bonne pratique, se demandant à peu près la théorie derrière.)
Modifier - Merci pour les réponses et commentaires. Pour clarifier, je suis également intéressé de savoir si être capable de faire cela est considéré comme une caractéristique positive, ou si c'est un compromis nécessaire pour une meilleure vérification de compilation/clarté du code/parce que la plupart des autres langues le font de cette manière. Il me semble idéalement que le compilateur vous prévienne ou vous prévienne, mais je suis loin d'être un concepteur de langage. Tout exemple de comment cela pourrait vous permettre de faire quelque chose d'utile (sans violer l'encapsulation) qui serait autrement difficile ou impossible serait génial.
BTW: Vous pouvez rendre 'ChangeData()' même 'static' et vous pourrez toujours accéder aux membres privés. – ulrichb
@ulrichb - Il est important de noter pour l'OP que vous ne pouvez pas utiliser le mot clé 'this' pour accéder aux membres privés si' ChangeData() 'est' static'. – TheCloudlessSky
En tant qu'exemple d'un langage différent - dans Ruby, public est le même, mais privé signifie «seulement accessible par la même instance» et protégé signifie «uniquement accessible depuis la même classe». L'héritage n'a rien à voir là-bas. – Tesserex