In C # und C++/CLI wird das Schlüsselwort sealed
(oder NotInheritable
in VB) verwendet, um eine Klasse vor einer möglichen Vererbung zu schützen (die Klasse ist nicht vererbbar). Ich weiß, dass ein Merkmal der objektorientierten Programmierung die Vererbung ist, und ich bin der Meinung, dass die Verwendung von sealed
gegen dieses Merkmal verstößt und die Vererbung stoppt. Gibt es ein Beispiel, das den Nutzen von sealed
zeigt und wann es wichtig ist, es zu verwenden?
In einer Klasse, die Sicherheitsfunktionen implementiert, so dass das ursprüngliche Objekt nicht als "Identität angenommen" werden kann.
Ganz allgemein habe ich mich kürzlich mit einer Person bei Microsoft ausgetauscht, die mir mitteilte, dass sie versucht hat, die Vererbung auf die Stellen zu beschränken, an denen dies wirklich Sinn macht, da es in Bezug auf die Leistung teuer wird, wenn es unbehandelt bleibt.
Das versiegelte Schlüsselwort sagt der CLR, dass es keine Klasse gibt, die weiter unten nach Methoden sucht, und das beschleunigt die Sache.
In den meisten leistungssteigernden Tools auf dem Markt finden Sie heutzutage ein Kontrollkästchen, das alle Ihre nicht vererbten Klassen versiegelt.
Seien Sie jedoch vorsichtig, denn wenn Sie Plugins oder die Assemblyerkennung über MEF zulassen möchten, treten Probleme auf.
Ein Nachtrag zu Baboons hervorragender Antwort:
In einem verwandten Hinweis, der nur für nicht versiegelte Klassen gilt: Jede Methode, die virtual
erstellt wurde, ist ein Erweiterungspunkt oder sollte zumindest ein Erweiterungspunkt sein. Das Deklarieren von Methoden virtual
sollte ebenfalls eine bewusste Entscheidung sein. (In C # ist dies eine bewusste Entscheidung. In Java ist es nicht.)
[~ # ~] edit [~ # ~] : Einige relevante Links:
Beachten Sie auch, dass Kotlin standardmäßig Klassen versiegelt; sein open
Schlüsselwort ist das Gegenteil von Javas final
oder dem sealed
von C # . (Um sicher zu sein, es gibt keine allgemeine Übereinstimmung, dass dies eine gute Sache ist .)
Das Markieren einer Klasse als Sealed
verhindert das Manipulieren wichtiger Klassen, die die Sicherheit beeinträchtigen oder die Leistung beeinträchtigen können.
Oft ist das Versiegeln einer Klasse auch dann sinnvoll, wenn eine Utility-Klasse mit festem Verhalten entworfen wird, das wir nicht ändern möchten.
Beispiel: System
Namespace in C#
stellt viele versiegelte Klassen bereit, z. B. String
. Wenn es nicht versiegelt ist, ist es möglich, seine Funktionalität zu erweitern, was unerwünscht sein kann, da es sich um einen grundlegenden Typ mit gegebener Funktionalität handelt.
Ebenso structures
in C#
sind immer implizit versiegelt. Daher kann man eine Struktur/Klasse nicht von einer anderen Struktur ableiten. Der Grund dafür ist, dass structures
nur zum Modellieren von eigenständigen, atomaren, benutzerdefinierten Datentypen verwendet wird, die nicht geändert werden sollen.
Manchmal möchten Sie beim Erstellen von Klassenhierarchien möglicherweise einen bestimmten Zweig in der Vererbungskette abschließen, der auf Ihrem Domänenmodell oder Ihren Geschäftsregeln basiert.
Beispiel: Ein Manager
und ein PartTimeEmployee
sind beide Employee
s, aber nach Teilzeitbeschäftigten in Ihrer Organisation haben Sie keine Rolle. In diesem Fall möchten Sie möglicherweise PartTimeEmployee
versiegeln, um eine weitere Verzweigung zu verhindern. Wenn Sie andererseits stündliche oder wöchentliche Teilzeitbeschäftigte haben, ist es möglicherweise sinnvoll, diese von PartTimeEmployee
zu erben.
Ich denke, dieser Beitrag hat einen guten Zweck. Der spezielle Fall war, als versucht wurde, eine nicht versiegelte Klasse in eine zufällige Schnittstelle umzuwandeln. Der Compiler wirft keinen Fehler. Wenn seal verwendet wird, gibt der Compiler einen Fehler aus, den er nicht konvertieren kann. Versiegelte Klasse bringt zusätzliche Code-Zugriffssicherheit.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla