Molte risposte sono già state aggiunte a questo interessante thread, tuttavia, non ho ancora trovato la vera ragione per cui questo comportamento è così. Lasciami provare:
Tempo fa
A metà tra Smalltalk negli anni '80 e Java a metà degli anni '90, il concetto di orientamento agli oggetti è maturato. Nascondere le informazioni, originariamente non considerato un concetto disponibile solo per OO (menzionato per primo nel 1978), è stato introdotto in Smalltalk poiché tutti i dati (campi) di una classe sono privati, tutti i metodi sono pubblici. Durante i numerosi nuovi sviluppi di OO negli anni '90, Bertrand Meyer ha cercato di formalizzare gran parte dei concetti di OO nel suo libro di riferimento Object Oriented Software Construction (OOSC) che da allora è stato considerato un riferimento (quasi) definitivo su concetti di OO e design del linguaggio .
In caso di visibilità privata
Secondo Meyer, un metodo dovrebbe essere reso disponibile per un insieme definito di classi (pagina 192-193). Ciò offre ovviamente una granularità molto elevata di occultamento delle informazioni, la seguente funzione è disponibile per la classe A e la classe B e tutti i loro discendenti:
feature {classA, classB}
methodName
Nel caso di private
lui dice quanto segue: senza dichiarare esplicitamente un tipo come visibile alla propria classe, non è possibile accedere a tale funzione (metodo / campo) in una chiamata qualificata. Vale a dire se x
è una variabile, x.doSomething()
non è consentito. L'accesso non qualificato è consentito, ovviamente, all'interno della classe stessa.
In altre parole: per consentire l'accesso da un'istanza della stessa classe, è necessario consentire esplicitamente al metodo l'accesso da quella classe. Questo a volte viene chiamato istanza-privato contro classe-privato.
Istanza privata nei linguaggi di programmazione
Conosco almeno due lingue attualmente in uso che utilizzano il nascondimento di informazioni private dell'istanza anziché il nascondiglio di informazioni private di classe. Uno è Eiffel, un linguaggio progettato da Meyer, che porta OO al massimo. L'altro è Ruby, un linguaggio molto più comune al giorno d'oggi. In Ruby private
significa: "privato per questa istanza" .
Scelte per il design della lingua
È stato suggerito che consentire l'istanza-privato sarebbe difficile per il compilatore. Non credo, dato che è relativamente semplice consentire o vietare chiamate qualificate a metodi. Se per un metodo privato, doSomething()
è consentito ex.doSomething()
non lo è, un designer linguistico ha effettivamente definito l'accessibilità solo istanza per metodi e campi privati.
Da un punto di vista tecnico, non c'è motivo di scegliere in un modo o nell'altro (specialmente se si considera che Eiffel.NET può farlo con IL, anche con eredità multipla, non c'è motivo intrinseco per non fornire questa funzione).
Certo, è una questione di gusti e, come già menzionato da altri, alcuni metodi potrebbero essere più difficili da scrivere senza la funzionalità di visibilità a livello di classe di metodi e campi privati.
Perché C # consente solo l'incapsulamento di classe e non l'incapsulamento di istanze
Se si guardano i thread di Internet sull'incapsulamento dell'istanza (un termine talvolta usato per indicare il fatto che una lingua definisce i modificatori di accesso a livello di istanza, a differenza del livello di classe), il concetto è spesso disapprovato. Tuttavia, considerando che alcuni linguaggi moderni usano l'incapsulamento di istanze, almeno per il modificatore di accesso privato, ti fa pensare che possa essere ed è utile nel moderno mondo della programmazione.
Tuttavia, C # ha certamente guardato più attentamente a C ++ e Java per la sua progettazione del linguaggio. Mentre Eiffel e Modula-3 erano anche nella foto, considerando le molte caratteristiche di Eiffel mancanti (eredità multipla) credo che abbiano scelto la stessa rotta di Java e C ++ quando si è trattato del modificatore di accesso privato.
Se vuoi davvero sapere il motivo per cui dovresti provare a trovare Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg o chiunque abbia lavorato sullo standard di C #. Sfortunatamente, non sono riuscito a trovare una nota definitiva nel linguaggio di programmazione annotato C # .