class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Ten kod kompiluje się w języku C#, a odpowiednik działa w PHP, ale czy ktoś może wyjaśnić, dlaczego tutaj można zmienić otherTestClass._privateString
?Dlaczego prywatne zmienne członkowskie mogą być zmieniane przez instancję klasy?
Wydaje mi się, że wystąpienie klasy nie powinno być w stanie zmienić prywatnej zmiennej członkowskiej w żadnych okolicznościach, a próba uzyskania dostępu do otherTestClass._privateString
spowodowałaby błąd "niedostępny z powodu poziomu ochrony".
To nie jest przypadek, choć, więc dlaczego instancji obiektu wewnątrz własnej klasy pozwalają uzyskać dostęp do prywatnych członków? A czy w takim razie nie może to zepsuć enkapsulacji? Czy może brakuje mi czegoś oczywistego?
- (Nie pytam, czy powyższe klasy konstrukcja jest dobra praktyka, po prostu zastanawiasz się o teorii za nim.)
Edycja - dzięki za odpowiedzi i komentarze. Aby wyjaśnić, jestem również zainteresowany wiedząc, czy możliwość to zrobić jest uważana za pozytywną cechę, lub jeśli jest to koniecznym kompromisem dla lepszego sprawdzania kompilacji/klarowności/ponieważ większość innych języków robi to w ten czy w inny sposób. Wydaje mi się, że idealnie kompilator zapobiegnie lub ostrzeże cię o tym, ale jestem daleki od projektanta języka. Wszelkie przykłady tego, jak to jest w ten sposób, pozwalają zrobić coś użytecznego (bez naruszania hermetyzacji), które w przeciwnym razie byłoby trudne lub niemożliwe, byłoby wspaniałe.
BTW: Możesz zrobić 'ChangeData()' even 'static' i nadal będziesz mieć dostęp do prywatnych członków. – ulrichb
@ulrichb - Ważne, aby zwrócić uwagę na OP, że nie można użyć słowa kluczowego 'this', aby uzyskać dostęp do prywatnych członków, jeśli' ChangeData() 'jest' statyczne'. – TheCloudlessSky
Jako przykład języka, który jest inny - w języku Ruby publiczne jest takie samo, ale prywatne oznacza "dostępny tylko przez tę samą instancję", a chronione oznacza "dostępne tylko z tej samej klasy". Dziedziczenie nie ma z tym nic wspólnego. – Tesserex