Kann mich jemand über den Unterschied zwischen private
und protected
Mitgliedern in Klassen aufklären ?
Ich verstehe aus Best-Practice-Konventionen, dass Variablen und Funktionen, die nicht außerhalb der Klasse aufgerufen werden, erstellt werden sollten private
- aber wenn ich mein MFC- Projekt betrachte, scheint MFC dies zu bevorzugen protected
.
Was ist der Unterschied und welchen soll ich verwenden?
Öffentliche Mitglieder einer Klasse A sind für alle zugänglich.
Geschützte Mitglieder einer Klasse A sind nicht außerhalb des Codes von A zugänglich, sondern über den Code einer von A abgeleiteten Klasse.
Auf private Mitglieder einer Klasse A kann außerhalb des Codes von A oder des Codes einer von A abgeleiteten Klasse nicht zugegriffen werden.
Die Wahl zwischen geschützt und privat beantwortet also letztendlich die folgenden Fragen: Wie viel Vertrauen möchten Sie dem Programmierer der abgeleiteten Klasse entgegenbringen?
Nehmen Sie standardmäßig an , dass die abgeleitete Klasse nicht vertrauenswürdig ist, und machen Sie Ihre Mitglieder privat . Wenn Sie einen sehr guten Grund haben, den Interna der Mutterklasse freien Zugriff auf die abgeleiteten Klassen zu gewähren, können Sie sie schützen.
quelle
the protected data of the base class is part of the data of the derived class.
In der Tat. Ist es dann nicht besser, wenn der Verfasser der abgeleiteten Klasse diese Daten in ihrer Klasse deklariert, anstatt in meiner? ... :-) ...The writer of the derived class is expected to handle this data properly or it is a bug.
Im NVI-Muster ist das Ziel, alles privat zu machen, einschließlich Methoden, um den Schaden zu begrenzen, den der abgeleitete Klassenschreiber der Hierarchie zufügen könnte. Geschützte Methoden sind bereits ein potenzielles Problem. Ich bin nicht davon überzeugt, dass es der richtige Ansatz ist, dies durch die Verwendung eines geschützten Staates zu verschärfen.Auf geschützte Mitglieder kann über abgeleitete Klassen zugegriffen werden. Private können nicht.
In Bezug auf "Best Practice" kommt es darauf an. Wenn es sogar eine schwache Möglichkeit gibt, dass jemand eine neue Klasse von Ihrer vorhandenen ableiten möchte und Zugriff auf interne Mitglieder benötigt, machen Sie sie geschützt und nicht privat. Wenn sie privat sind, kann es schwierig werden, Ihre Klasse leicht zu erben.
quelle
Der Grund, warum MFC den Schutz bevorzugt, liegt darin, dass es sich um ein Framework handelt. Sie möchten wahrscheinlich die MFC-Klassen in Unterklassen unterteilen. In diesem Fall ist eine geschützte Schnittstelle erforderlich, um auf Methoden zuzugreifen, die für die allgemeine Verwendung der Klasse nicht sichtbar sind.
quelle
Es hängt alles davon ab, was Sie tun möchten und was die abgeleiteten Klassen sehen können sollen.
quelle
Als gekennzeichnet gekennzeichnete Attribute und Methoden
protected
sind - im Gegensatz zu privaten - in Unterklassen weiterhin sichtbar.Sofern Sie die Methode in möglichen Unterklassen nicht verwenden oder die Möglichkeit bieten möchten, sie zu überschreiben, würde ich sie erstellen
private
.quelle
Schauen Sie sich sicher die Frage zu geschützten Mitgliedsvariablen an . Es wird empfohlen, privat als Standard zu verwenden (genau wie bei C ++
class
), um die Kopplung zu verringern. Geschützte Elementvariablen sind meistens eine schlechte Idee. Geschützte Elementfunktionen können beispielsweise für das Muster der Vorlagenmethode verwendet werden.quelle
Auf geschützte Mitglieder kann nur von Nachkommen der Klasse und per Code im selben Modul zugegriffen werden. Auf private Mitglieder kann nur von der Klasse zugegriffen werden, in der sie deklariert sind, und von Code im selben Modul.
Natürlich werfen Freundfunktionen dies aus dem Fenster, aber na ja.
quelle
Auf private Mitglieder kann nur innerhalb der Klasse zugegriffen werden, auf geschützte Mitglieder kann in der Klasse zugegriffen werden, und auf abgeleitete Klassen. Es ist eine Funktion der Vererbung in OO-Sprachen.
Sie können in C ++ eine private, geschützte und öffentliche Vererbung haben, die bestimmt, auf welche abgeleiteten Klassen in der Vererbungshierarchie zugegriffen werden kann. C # hat zum Beispiel nur öffentliche Vererbung.
quelle
privat = nur für das Mutterschiff (Basisklasse) zugänglich (dh nur meine Eltern können in das Schlafzimmer meiner Eltern gehen)
geschützt = zugänglich durch Mutterschiff (Basisklasse) und ihre Töchter (dh nur meine Eltern können in das Schlafzimmer meiner Eltern gehen, haben aber dem Sohn / der Tochter die Erlaubnis gegeben, in das Schlafzimmer der Eltern zu gehen)
public = zugänglich für Mutterschiff (Basisklasse), Tochter und alle anderen (dh nur meine Eltern können in das Schlafzimmer meiner Eltern gehen, aber es ist eine Hausparty - mi casa su casa)
quelle
Da zum Abrufen und Aktualisieren geschützter Mitglieder in der abgeleiteten Klasse keine Funktion für öffentliche Elemente erforderlich ist, erhöht dies die Effizienz des Codes und verringert die Menge an Code, die geschrieben werden muss. Der Programmierer der abgeleiteten Klasse sollte jedoch wissen, was er tut.
quelle
private
wird für Mitgliedsdaten bevorzugt. Mitglieder in C ++ - Klassen sindprivate
standardmäßig.public
wird für Mitgliederfunktionen bevorzugt, ist jedoch Ansichtssache. Zumindest einige Methoden müssen zugänglich sein.public
ist für alle zugänglich. Es ist die flexibelste Option und am wenigsten sicher. Jeder kann sie benutzen und jeder kann sie missbrauchen.private
ist überhaupt nicht zugänglich. Niemand kann sie außerhalb der Klasse benutzen und niemand kann sie missbrauchen. Nicht einmal in abgeleiteten Klassen.protected
ist ein Kompromiss, da es in abgeleiteten Klassen verwendet werden kann. Wenn Sie von einer Klasse abgeleitet sind, haben Sie ein gutes Verständnis der Basisklasse und achten darauf, diese Mitglieder nicht zu missbrauchen.MFC ist ein C ++ - Wrapper für die Windows-API, bevorzugt
public
undprotected
. Klassen , die von Visual Studio - Assistenten eine hässliche Mischung aus habenprotected
,public
undprivate
Mitglieder. Die MFC-Klassen selbst haben jedoch eine gewisse Logik.Mitglieder wie
SetWindowText
sind,public
weil Sie häufig auf diese Mitglieder zugreifen müssen.Mitglieder wie z. B.
OnLButtonDown
bearbeiten Benachrichtigungen, die vom Fenster empfangen werden. Sie sollten nicht zugänglich sein, deshalb sind sieprotected
. Sie können weiterhin in der abgeleiteten Klasse darauf zugreifen, um diese Funktionen zu überschreiben.Einige Mitglieder müssen Threads und Nachrichtenschleifen ausführen. Sie sollten nicht darauf zugreifen oder sie überschreiben, daher werden sie als deklariert
private
In C ++ - Strukturen sind Mitglieder
public
standardmäßig. Strukturen werden normalerweise nur für Daten verwendet, nicht für Methoden. Daher wird diepublic
Deklaration als sicher angesehen.quelle
private
standardmäßig in Visual Studio. Es istprivate
standardmäßig auch in gcc, es ist niepublic
standardmäßig. Es sei denn, ich liege wieder falsch. Ich kann den Standard, auf den Sie sich beziehen, nicht finden.Auf private Mitglieder kann nur in derselben Klasse zugegriffen werden, in der sie deklariert haben, wobei auf geschützte Mitglieder in Klassen zugegriffen werden kann, in denen sie zusammen mit den von ihr geerbten Klassen deklariert sind.
quelle
Privat : Dies ist ein Zugriffsspezifizierer. Standardmäßig sind die Instanzvariablen (Mitgliedsvariablen) oder die Methoden einer Klasse in c ++ / java privat. Während der Vererbung werden der Code und die Daten immer vererbt, sind jedoch außerhalb der Klasse nicht zugänglich. Wir können unsere Datenmitglieder als privat deklarieren, damit niemand direkte Änderungen an unseren Mitgliedsvariablen vornehmen kann, und wir können öffentliche Getter und Setter bereitstellen, um unsere privaten Mitglieder zu ändern. Und dieses Konzept wird immer in der Geschäftsregel angewendet.
Geschützt : Es ist auch ein Zugriffsspezifizierer. In C ++ sind die geschützten Mitglieder innerhalb der Klasse und für die geerbte Klasse zugänglich, jedoch nicht außerhalb der Klasse. In Java sind die geschützten Mitglieder innerhalb der Klasse sowohl für die geerbte Klasse als auch für alle Klassen innerhalb desselben Pakets zugänglich.
quelle
Auf ein geschütztes nicht statisches Basisklassenmitglied können Mitglieder und Freunde aller von dieser Basisklasse abgeleiteten Klassen mit einer der folgenden Methoden zugreifen:
quelle
Privat: Zugriff über Klassenmitgliedsfunktionen und Freundfunktionen oder Freundklassen. Für die C ++ - Klasse ist dies der Standardzugriffsspezifizierer.
Geschützt: Zugriff durch Funktionen von Klassenmitgliedern, Freundfunktionen oder Freundklassen und abgeleitete Klassen.
Weitere Informationen finden Sie unter diesem Link .
quelle
Private und geschützte Zugriffsmodifikatoren sind nur ein und dasselbe, auf das geschützte Mitglieder der Basisklasse außerhalb des Bereichs der Basisklasse in der untergeordneten (abgeleiteten) Klasse zugreifen können. Dies gilt auch für die Vererbung. Mit dem privaten Modifikator kann jedoch nur im Bereich oder Code der Basisklasse auf die Mitglieder der Basisklasse zugegriffen werden, und ihre Freundfunktionen funktionieren nur '' ''
quelle