Warum kann ich in .NET auf private Member einer Klasseninstanz innerhalb der Klasse zugreifen?

7

Beim Löschen von Code, der heute von jemand anderem geschrieben wurde, habe ich den Zugriffsmodifikator von Public auf Private für eine Klassenvariable / ein Mitglied / ein Feld geändert. Ich erwartete eine lange Liste von Compiler-Fehlern, die ich verwende, um den Code, der diese Variable verwendet, zu "refaktorieren / nachzuarbeiten / zu überprüfen". Stellen Sie sich meine Überraschung vor, als ich keine Fehler bekam. Nach der Überprüfung stellt sich heraus, dass eine andere Instanz der Klasse auf die privaten Mitglieder einer anderen in der Klasse deklarierten Instanz zugreifen kann. Völlig unvorbereitet.

Ist das normal? Ich habe in .NET von Anfang an programmiert und bin nie auf dieses Problem gestoßen, noch habe ich darüber gelesen. Ich bin vielleicht schon mal darüber gestolpert, aber nur "vage bemerkt" und gehe weiter. Kann mir jemand dieses Verhalten erklären? Ich würde gerne wissen, warum ich das machen kann. Bitte erklären Sie mir, sagen Sie mir nicht nur die Regel. Mache ich etwas falsch? Ich habe dieses Verhalten in C # und VB.NET gefunden. Der Code scheint die Möglichkeit zu nutzen, auf private Variablen zuzugreifen. Der Nachteil ist, dass der Programmierer einen großen Teller Spaghetti erstellt hat.

Mit freundlichen Grüßen

  • Völlig verwirrt
%Vor%     
AMissico 10.04.2010, 23:38
quelle

4 Antworten

13

Das ist "normal". Private Mitglieder sind für die Klasse und nicht für die bestimmte Instanz privat.

    
user200783 10.04.2010, 23:41
quelle
10

Du hast gesagt:

  

Bitte erläutern Sie, sagen Sie mir nicht nur die Regel.

Nun, hier sind meine zwei Cent.

Wie ich es sehe, ist die Prämisse von privaten Mitgliedern einer Klasse, dass sich eine Klasse intern ihrer eigenen Implementierung bewusst sein kann, ohne diese Implementierung der Außenwelt offen zu legen. Somit ist eine Instanz einer Klasse vollkommen in der Lage zu verstehen, wie eine andere Instanz der gleichen Klasse implementiert wird; es ist also nicht davon eingeschränkt, dieses Implementierungswissen zu nutzen.

Wenn wir uns gegenseitig manipulieren, werde ich zugeben, dass das etwas ungewöhnlich ist. Aber nimm zum Beispiel statische Bauweisen. Würden Sie diese auch auf private Mitglieder der Instanzen beschränken? Wenn ja, haben Sie viel nützlichen Code unmöglich gemacht. Wenn nicht, ist es nicht klar, warum statische Methoden auf private Member zugreifen dürfen, die Instanzmethoden jedoch nicht.

Mit anderen Worten, das Wort "privat" in OOP soll nicht die Idee von persönlicher Privatsphäre vermitteln, wie bei Individuen, die sich gegenseitig verstecken. Man denke eher an eine Klasse als einen eher "nur für Mitglieder" bestimmten Club , wo es bestimmte Arten gibt, Dinge zu tun, die nur die Mitglieder des Clubs kennen.

    
Dan Tao 15.04.2010 01:37
quelle
1

Das Problem des Zugriffs ist, wo der Code auf die privaten Mitglieder zugreift und nicht so sehr darüber, auf was er durch sie zugreift.

Sie haben Zugriff auf das Feld _foo._int in der Definition der Klasse Foo , aber nicht außerhalb davon.

Es mag Sie weiter überraschen, dass die folgende Erweiterung der verschachtelten Fred -Klasse auch legal ist.

%Vor%     
Enigmativity 15.04.2010 01:41
quelle
-1

Dies ist das erwartete Verhalten. Geschachtelte Klassen können auf private Mitglieder der Containerklasse zugreifen.

    
Pierreten 10.04.2010 23:42
quelle

Tags und Links