Ya se han agregado algunas respuestas a este interesante hilo, sin embargo, no encontré la razón real de por qué este comportamiento es como es. Déjame intentarlo:
Tiempo atrás
En algún lugar entre Smalltalk en los años 80 y Java a mediados de los 90, el concepto de orientación a objetos maduró. La ocultación de información, que originalmente no se consideraba un concepto solo disponible para OO (mencionado por primera vez en 1978), se introdujo en Smalltalk ya que todos los datos (campos) de una clase son privados, todos los métodos son públicos. Durante los muchos desarrollos nuevos de OO en los años 90, Bertrand Meyer intentó formalizar gran parte de los conceptos de OO en su libro histórico. Object Oriented Software Construction (OOSC), que desde entonces se ha considerado una referencia (casi) definitiva sobre conceptos de OO y diseño de lenguaje. .
En el caso de visibilidad privada
Según Meyer, un método debería estar disponible para un conjunto definido de clases (página 192-193). Obviamente, esto proporciona una granularidad muy alta de la ocultación de información, la siguiente característica está disponible para la clase A y la clase B y todos sus descendientes:
feature {classA, classB}
methodName
En el caso de private
que diga lo siguiente: sin declarar explícitamente un tipo como visible para su propia clase, no puede acceder a esa característica (método / campo) en una llamada calificada. Es decir, si x
es una variable, x.doSomething()
no está permitido. El acceso no calificado está permitido, por supuesto, dentro de la clase misma.
En otras palabras: para permitir el acceso de una instancia de la misma clase, debe permitir el acceso del método de esa clase explícitamente. Esto a veces se llama instancia-privado versus clase-privado.
Instancia privada en lenguajes de programación
Sé de al menos dos idiomas actualmente en uso que utilizan la ocultación de información privada de instancia en lugar de la ocultación de información privada de clase. Uno es Eiffel, un lenguaje diseñado por Meyer, que lleva a OO a sus extremos. El otro es Ruby, un lenguaje mucho más común hoy en día. En Ruby, private
significa: "privado para esta instancia" .
Elecciones para el diseño del lenguaje.
Se ha sugerido que permitir instancia-privada sería difícil para el compilador. No lo creo, ya que es relativamente simple permitir o rechazar llamadas calificadas a métodos. Si es por un método privado, doSomething()
está permitido yx.doSomething()
no , un diseñador de lenguaje ha definido efectivamente la accesibilidad de solo instancia para métodos y campos privados.
Desde un punto de vista técnico, no hay razón para elegir de una forma u otra (especialmente si se considera que Eiffel.NET puede hacer esto con IL, incluso con herencia múltiple, no hay una razón inherente para no proporcionar esta función).
Por supuesto, es una cuestión de gustos y, como ya se mencionó, algunos métodos podrían ser más difíciles de escribir sin la característica de visibilidad a nivel de clase de los métodos y campos privados.
Por qué C # solo permite la encapsulación de clases y no la encapsulación de instancias
Si observa los hilos de Internet en la encapsulación de instancias (un término que a veces se usa para referirse al hecho de que un lenguaje define los modificadores de acceso a nivel de instancia, en oposición al nivel de clase), el concepto a menudo está mal visto. Sin embargo, teniendo en cuenta que algunos lenguajes modernos usan la encapsulación de instancias, al menos para el modificador de acceso privado, te hace pensar que puede ser y es útil en el mundo de la programación moderna.
Sin embargo, C # ciertamente ha mirado más duro en C ++ y Java por su diseño de lenguaje. Si bien Eiffel y Modula-3 también estaban en la imagen, teniendo en cuenta las muchas características de Eiffel que faltan (herencia múltiple), creo que eligieron la misma ruta que Java y C ++ cuando se trataba del modificador de acceso privado.
Si realmente quiere saber por qué debería tratar de contactar a Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg o cualquier otra persona que trabajó en el estándar de C #. Desafortunadamente, no pude encontrar una nota definitiva en el lenguaje de programación anotado The C # .