una tipos que programacion orientada objetos miembros metodos metodo ejemplos clases clase atributos c# oop encapsulation instantiation private-members

c# - tipos - que es una clase en programacion



¿Por qué se puede cambiar la variable miembro privada por instancia de clase? (2)

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 la razón por la que otherTestClass._privateString se puede cambiar aquí?

Habría pensado que una instancia de una clase no debería poder cambiar una variable miembro privada bajo ninguna circunstancia, y que intentar acceder a otherTestClass._privateString daría un error "inaccesible debido al 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 no, ¿esto no rompe la encapsulación hasta cierto punto? ¿O me estoy perdiendo algo obvio?

  • (No estoy preguntando si el diseño de clase anterior es una buena práctica, solo me estoy preguntando acerca de la teoría que la respalda).

Editar - Gracias por las respuestas y comentarios. Para aclarar, también me interesa saber si el hecho de poder hacer esto se considera una característica positiva, o si es un compromiso necesario para una mejor verificación en tiempo de compilación / claridad de código / porque la mayoría de los otros idiomas 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 idiomas. Cualquier ejemplo de cómo ser 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.


Esto se debe a que C # impone la privacidad de nivel de clase y no la privacidad de nivel de objeto.

La mayoría de los lenguajes principales aplican la misma política, es decir, C #, C ++ y Java. Creo que la razón es:

1) porque los desarrolladores están acostumbrados a ese tipo de política;

2) porque la privacidad a nivel de objeto sería demasiado tediosa a cambio de muy pocas ventajas.


Los miembros privados pueden acceder a cualquier código dentro del texto del programa de esa clase (incluso dentro de los tipos anidados). No tiene nada que ver con qué instancia de la clase estás tratando.

No creo que esto infrinja la encapsulación: la API todavía está separada de la implementación, pero la implementación "sabe" sobre sí misma, independientemente de la instancia que esté mirando.

Creo que en otros idiomas no es así como funciona la accesibilidad, pero definitivamente lo es para C # y Java. (Java tiene reglas ligeramente diferentes sobre lo que puede acceder a los miembros privados, pero el código traducido para lo que has escrito aún funcionaría).