Simpler "Verhindern abgeleiteter Klassen" in C ++

8

Unter der Annahme, dass es einen legitimen Grund gibt, die Ableitung von irgendeiner Klasse zu verhindern, gibt Bjarne hier eine Lösung für die Antwort zu "Kann ich Leute stoppen, die von meiner Klasse abstammen?"

Allerdings dachte ich:

%Vor%

Wenn man versucht zu kompilieren, bekommt man:

%Vor%

Funktioniert meine Lösung für alle Fälle? IMHO, es ist besser, weil die Klasse final generisch ist und keine Vorkenntnisse der Klasse erfordert, um die Ableitung von zu verhindern.

    
Paul J. Lucas 04.04.2011, 17:33
quelle

2 Antworten

6

Die Lösung ist ziemlich schlecht, sie könnte mit CRTP verbessert werden (Adobe tut das), aber es wird keine vollständige Lösung sein. Das Problem mit deinem Code ist, dass ein anderer Programmierer, der deinen Vertrag nicht brechen will (sie ist ein guter Mensch), aber nicht weiß, dass sie nicht von deiner Klasse abgeleitet sein sollte, andere davon abhalten könnte, von ihrer eigenen Klasse abzuleiten:

%Vor%

Beachten Sie, dass es keine böswillige Absicht gibt und der Vertrag gebrochen ist. Die Verbesserung mit CRTP wäre:

%Vor%

Dies wird den vorherigen Fehler auffangen, da ihr Code wäre:

%Vor%

Und da sie nicht von seal<YourSealedClass> erbt, wird der Compiler es auffangen.

Das Problem bei diesem Ansatz ist, dass es einige hartnäckige (oder bösartige) Programmierer nicht daran hindert, zu schreiben:

%Vor%

Um ein Kind der Siegelklasse zu werden und als solches Zugang zu Ihrer eigenen Klasse zu bekommen.

In C ++ 0x I glaube ich (müsste es noch einmal überprüfen), dass sie die Einschränkung aufbringen, dass eine Vorlage nicht mit einem Template-Argument in Verbindung gebracht werden kann, und das wäre ein guter Schritt in einen generischen Typesafe Lösung für einen Klassenversiegler:

%Vor%

Der Vorteil dieses Ansatzes (derzeit nicht verfügbar) besteht darin, dass der Konstruktor und die Destruktoren privat sind und nur Freunde den Typ instanziieren können. Da Sie das CRTP verwenden, um von einer bestimmten Instanz zu erben, die Ihren eigenen Typ als Argument übergibt, sagen Sie dem Compiler, dass nur Sie Ihre Basis tatsächlich instanziieren können, und alle Teile fallen genau in den richtigen Platz.

    
David Rodríguez - dribeas 04.04.2011, 17:43
quelle
2

Versuchen Sie:

%Vor%     
James Kanze 04.04.2011 17:47
quelle

Tags und Links