Algumas respostas já foram adicionadas a esse segmento interessante, no entanto, eu não encontrei a verdadeira razão pela qual esse comportamento é do jeito que é. Deixe-me tentar:
Antigamente
Em algum lugar entre Smalltalk nos anos 80 e Java em meados dos anos 90, o conceito de orientação a objetos amadureceu. A ocultação de informações, não originalmente pensada como um conceito disponível apenas para OO (mencionado primeiro em 1978), foi introduzida no Smalltalk, pois todos os dados (campos) de uma classe são privados, todos os métodos são públicos. Durante os muitos novos desenvolvimentos de OO nos anos 90, Bertrand Meyer tentou formalizar muitos dos conceitos de OO em seu livro de referência Object Oriented Software Construction (OOSC), que desde então é considerado uma referência (quase) definitiva sobre conceitos e design de linguagem de OO .
No caso de visibilidade privada
De acordo com Meyer, um método deve ser disponibilizado para um conjunto definido de classes (página 192-193). Obviamente, isso oferece uma granularidade muito alta de ocultação de informações; o seguinte recurso está disponível para classe A e classe B e todos os seus descendentes:
feature {classA, classB}
methodName
No caso de private
ele diz o seguinte: sem declarar explicitamente um tipo como visível para sua própria classe, você não pode acessar esse recurso (método / campo) em uma chamada qualificada. Ou seja, se x
é uma variável, x.doSomething()
não é permitido. O acesso não qualificado é permitido, é claro, dentro da própria classe.
Em outras palavras: para permitir o acesso por uma instância da mesma classe, você deve permitir explicitamente o acesso ao método por essa classe. Às vezes, isso é chamado de instância-privada versus classe-privada.
Privado da instância em linguagens de programação
Conheço pelo menos dois idiomas atualmente em uso que usam informações privadas de instância ocultas, em oposição a informações privadas de classe. Uma é a Eiffel, uma linguagem projetada por Meyer, que leva o OO ao extremo. O outro é Ruby, uma linguagem muito mais comum atualmente. Em Ruby, private
significa: "privado para esta instância" .
Opções para design de linguagem
Foi sugerido que permitir o privado da instância seria difícil para o compilador. Acho que não, pois é relativamente simples apenas permitir ou proibir chamadas qualificadas a métodos. Se, para um método privado, doSomething()
é permitido e x.doSomething()
não é, um designer de linguagem definiu efetivamente acessibilidade somente de instância para métodos e campos privados.
Do ponto de vista técnico, não há razão para escolher uma maneira ou de outra (especialmente quando se considera que o Eiffel.NET pode fazer isso com IL, mesmo com herança múltipla, não há razão inerente para não fornecer esse recurso).
Obviamente, é uma questão de gosto e, como outros já mencionaram, alguns métodos podem ser mais difíceis de escrever sem o recurso de visibilidade no nível de classe de métodos e campos privados.
Por que o C # permite apenas o encapsulamento de classe e não o encapsulamento de instância
Se você observar os encadeamentos da Internet no encapsulamento de instância (um termo às vezes usado para se referir ao fato de que uma linguagem define os modificadores de acesso no nível da instância, em oposição ao nível da classe), o conceito geralmente é desaprovado. No entanto, considerando que algumas linguagens modernas usam encapsulamento de instância, pelo menos para o modificador de acesso privado, você pensa que pode ser e é útil no mundo da programação moderna.
No entanto, o C # reconheceu com mais atenção o C ++ e o Java por seu design de linguagem. Enquanto Eiffel e Modula-3 também estavam na imagem, considerando os muitos recursos de Eiffel ausentes (herança múltipla), acredito que eles escolheram a mesma rota que Java e C ++ quando se tratava do modificador de acesso privado.
Se você realmente quer saber por que deve tentar contatar Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg ou qualquer outra pessoa que trabalhou no padrão de C #. Infelizmente, não consegui encontrar uma nota definitiva na Linguagem de Programação C # anotada .