Heute ist mir aufgefallen, dass ich protected
im C ++ - Code grundsätzlich keine Methoden verwende, da ich selten das Bedürfnis habe, nicht öffentliche Methoden eines übergeordneten Elements aufzurufen. Ich verwende protected in Java im Muster der Template-Methode, aber da Sie private Methoden in C ++ überschreiben können, brauche ich das auch nicht protected
.
Was sind also einige reale Szenarien, in denen ich protected
Methoden in C ++ - Code verwenden möchte ?
(Beachten Sie, dass ich die Vererbung von Implementierungen im Allgemeinen nicht besonders mag, das könnte eine Menge erklären ...)
quelle
Ein Beispiel, das ich häufig verwende, ist, dass ich in der Basisklasse meiner Objekthierarchie einen geschützten Logger haben werde. Alle meine Basisklassen benötigen Zugriff auf den Logger, aber es gibt keinen Grund, diesen öffentlich zugänglich zu machen.
Wenn Sie das Vorlagenmuster verwenden und über eine Pre- oder Post-Execute-Methode für die Basisklasse verfügen, möchten Sie möglicherweise die Basisimplementierung über die überschreibende Methode aufrufen. Wenn die Basis nur privat ist (und weiterhin in C ++ überschrieben werden kann), können Sie die Basisimplementierung nicht über die überschreibende Methode aufrufen.
quelle
Nur ein Beispiel, das ich in der Vergangenheit verwendet habe. Geschützte Methoden eignen sich hervorragend für die Bereitstellung implementierungsspezifischer Funktionen und ermöglichen es der Basisklasse, die Dinge ordnungsgemäß zu verfolgen. Stellen Sie sich eine Basisklasse vor, die eine überschreibbare Initialisierungsfunktion bietet, aber auch einen Status haben muss, um festzustellen, ob sie initialisiert wurde:
Hier ist alles gut und schön. Außer wenn sich eine abgeleitete Klasse nicht darum kümmert,
setInitialized()
nicht zuletzt die Tatsache aufzurufen , dass jeder sie aufrufen kann (wir könnten dies hier als geschützt erklären und einen weiteren Grund, geschützte Methoden zu verwenden!). Ich bevorzuge eine Klasse, die virtuelle geschützte Mitglieder verwendet:In unserer neuen Klasse wird die gesamte Initialisierung weiterhin an die abgeleitete Klasse delegiert. Vorausgesetzt, es wurde eine Ausnahme ausgelöst, wird der Vertrag "Diese Klasse ist initialisiert" beibehalten, der nach unserer Methode ausgeführt wird.
quelle
Wie bei vielen anderen Funktionen
protected
können Sie die Kapselung in gewissem Umfang aufheben. Das Aufbrechen der reinen OO-Konzepte erfolgt normalerweise aus mehreren Gründeninline
),friend
ermöglicht es Ihnen, den Zugriff auf Klassenmitglieder auf wenige Freunde zu beschränken)und
protected
ist nur eines der Tools in dieser Box. Sie können es verwenden, wenn Sie abgeleiteten Klassen Zugriff auf einige Teile einer Klasse gewähren möchten, die für die breite Öffentlichkeit verborgen werden sollen.Ein Fall, in dem ich es verwendet habe, besteht darin, alle Konstruktoren einer Klasse zu
protected
abstrahieren (Sie können es nur als Unterobjekt eines Objekts einer abgeleiteten Klasse instanziieren).quelle
Vielleicht war es schlechtes Design, aber ich hatte es für so etwas:
Abgeleitete Klassen können
update()
das Signal durch Aufrufen auslösentrigger_signal()
. Aber weil das alles ist, was sie mit dem Signal tun sollten, wurde das Signal selbst privat gelassen. Die Trigger-Funktion wurde geschützt, da nur die abgeleitete Klasse in der Lage sein sollte, sie auszulösen, und überhaupt nichts.quelle
"Öffentliche Methoden": Eine Klasse kann dies tun. "Geschützte Methoden": Wie kann eine Klasse dies tun? "Private Methoden": Wie eine Klasse dies tun kann, aber "Ich bin paranoid und möchte nicht, dass jemand weiß, wie ich es tue".
Also kommt ein neuer Koch (Entwickler) in Ihr Fast-Food-Restaurant. Sie lehren es, Sie verkaufen Burger (öffentliche Methoden), wie man die Burger zubereitet (geschützte Methoden), aber behalten die "patentierte" Geheimrezeptsoße für sich.
quelle