Zu diesem interessanten Thread wurden bereits einige Antworten hinzugefügt, aber ich habe den wahren Grund nicht gefunden, warum dieses Verhalten so ist, wie es ist. Lassen Sie es mich versuchen:
Damals
Irgendwo zwischen Smalltalk in den 80ern und Java Mitte der 90er Jahre reifte das Konzept der Objektorientierung. Das Verstecken von Informationen, das ursprünglich nicht als Konzept gedacht war, das nur OO zur Verfügung stand (erstmals 1978 erwähnt), wurde in Smalltalk eingeführt, da alle Daten (Felder) einer Klasse privat und alle Methoden öffentlich sind. Während der vielen neuen Entwicklungen von OO in den 90er Jahren versuchte Bertrand Meyer, einen Großteil der OO-Konzepte in seinem wegweisenden Buch Object Oriented Software Construction (OOSC) zu formalisieren, das seitdem als (fast) endgültige Referenz zu OO-Konzepten und Sprachdesign gilt .
Bei privater Sichtbarkeit
Laut Meyer sollte eine Methode einer definierten Gruppe von Klassen zur Verfügung gestellt werden (Seite 192-193). Dies führt offensichtlich zu einer sehr hohen Granularität des Versteckens von Informationen. Die folgende Funktion steht Klasse A und Klasse B sowie allen ihren Nachkommen zur Verfügung:
feature {classA, classB}
methodName
Im Fall von private
sagt er Folgendes: Ohne einen Typ explizit als für seine eigene Klasse sichtbar zu deklarieren, können Sie in einem qualifizierten Aufruf nicht auf diese Funktion (Methode / Feld) zugreifen. Dh wenn x
es sich um eine Variable handelt, x.doSomething()
ist dies nicht zulässig. Unqualifizierter Zugriff ist natürlich innerhalb der Klasse selbst erlaubt.
Mit anderen Worten: Um den Zugriff einer Instanz derselben Klasse zuzulassen, müssen Sie den Methodenzugriff dieser Klasse explizit zulassen. Dies wird manchmal als instanzprivat gegenüber klassenprivat bezeichnet.
Instanz-privat in Programmiersprachen
Ich kenne mindestens zwei Sprachen, die derzeit verwendet werden und die das Verstecken von instanzprivaten Informationen im Gegensatz zum Verstecken von klassenprivaten Informationen verwenden. Eine davon ist Eiffel, eine von Meyer entworfene Sprache, die OO auf die Spitze treibt. Das andere ist Ruby, eine heutzutage weit verbreitete Sprache. In Ruby private
bedeutet: "privat für diese Instanz" .
Auswahlmöglichkeiten für die Sprachgestaltung
Es wurde vorgeschlagen, dass es für den Compiler schwierig sein würde, eine Instanz privat zuzulassen. Ich denke nicht, da es relativ einfach ist, qualifizierte Aufrufe von Methoden nur zuzulassen oder zu verbieten. Wenn für eine private Methode doSomething()
zulässig ist und x.doSomething()
nicht, hat ein Sprachdesigner die Nur-Instanz-Zugänglichkeit für private Methoden und Felder effektiv definiert.
Aus technischer Sicht gibt es keinen Grund, sich für die eine oder andere Art zu entscheiden (insbesondere wenn man bedenkt, dass Eiffel.NET dies mit IL tun kann, gibt es auch bei Mehrfachvererbung keinen inhärenten Grund, diese Funktion nicht bereitzustellen).
Natürlich ist es Geschmackssache, und wie andere bereits erwähnt haben, sind einige Methoden möglicherweise schwieriger zu schreiben, ohne dass private Methoden und Felder auf Klassenebene sichtbar sind.
Warum C # nur die Klassenkapselung und nicht die Instanzkapselung zulässt
Wenn Sie sich Internet-Threads zur Instanzkapselung ansehen (ein Begriff, der manchmal verwendet wird, um die Tatsache zu bezeichnen, dass eine Sprache die Zugriffsmodifikatoren auf Instanzebene im Gegensatz zur Klassenebene definiert), wird das Konzept häufig verpönt. Wenn man jedoch bedenkt, dass einige moderne Sprachen die Instanzkapselung verwenden, zumindest für den Modifikator für den privaten Zugriff, denken Sie, dass dies in der modernen Programmierwelt von Nutzen sein kann und ist.
Allerdings hat C # C ++ und Java für sein Sprachdesign zugegebenermaßen am härtesten untersucht. Während Eiffel und Modula-3 ebenfalls im Bild waren, glaube ich, dass sie angesichts der vielen fehlenden Funktionen von Eiffel (Mehrfachvererbung) dieselbe Route wie Java und C ++ gewählt haben, wenn es um den Modifikator für den privaten Zugriff ging.
Wenn Sie wirklich wissen möchten, warum Sie versuchen sollten, Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg oder andere Personen zu erreichen, die am Standard von C # gearbeitet haben. Leider konnte ich in der kommentierten Programmiersprache The C # keinen endgültigen Hinweis finden .