class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Este código se compila en C# y el equivalente funciona en PHP, pero ¿alguien puede explicar el motivo por el cual otherTestClass._privateString
se puede cambiar aquí?¿Por qué se puede cambiar la variable de miembro privado por instancia de clase?
Hubiera pensado que una instancia de una clase no debería poder cambiar una variable miembro privada bajo ninguna circunstancia, y que intentar acceder al otherTestClass._privateString
daría un error de "inaccesible debido a nivel de protección".
Sin embargo, este no es el caso, entonces ¿por qué la creación de instancias de un objeto dentro de su propia clase le permite acceder a los miembros privados? Y si lo hiciera, ¿no rompe esto la encapsulación en cierta medida? ¿O me estoy perdiendo algo obvio?
- (No estoy preguntando si el diseño de la clase anterior es una buena práctica, sólo me preguntaba acerca de la teoría detrás de él.)
Editar - Gracias por las respuestas y comentarios. Para aclarar, también me interesa saber si ser capaz de hacer esto se considera una característica positiva, o si es una compensación necesaria para una mejor verificación/claridad del código en tiempo de compilación/porque la mayoría de los otros lenguajes lo hacen de esa manera o lo que sea. Me parece ideal que el compilador lo prevenga o lo advierta, pero luego estoy lejos de ser un diseñador de lenguaje. Cualquier ejemplo de cómo es que de esta manera te permite hacer algo útil (sin violar la encapsulación) que de otra manera sería difícil o imposible, sería genial.
BTW: Puede hacer 'ChangeData()' even 'static' y aún podrá acceder a miembros privados. – ulrichb
@ulrichb - Es importante señalar para el OP que no puede usar la palabra clave 'this' para acceder a miembros privados si' ChangeData() 'es' static'. – TheCloudlessSky
Como ejemplo de un idioma que es diferente: en Ruby, public es lo mismo, pero private significa "solo accesible por la misma instancia" y protected significa "solo accesible desde la misma clase". La herencia no tiene nada que ver con eso allí. – Tesserex