In C # und C ++ / CLI wird das Schlüsselwort sealed
(oder NotInheritable
in VB) verwendet, um eine Klasse vor Vererbungschancen 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 zeigt sealed
und wann es wichtig ist, es zu verwenden?
Ein Nachtrag zu Baboons hervorragender Antwort :
In einem verwandten Hinweis, der nur für nicht versiegelte Klassen gilt: Jede erstellte Methode
virtual
ist ein Erweiterungspunkt oder sieht zumindest so aus, als ob sie ein Erweiterungspunkt sein sollte. Das Deklarieren von Methodenvirtual
sollte ebenfalls eine bewusste Entscheidung sein. (In C # ist dies eine bewusste Entscheidung, in Java nicht.)EDIT : Einige relevante Links:
Beachten Sie auch, dass Kotlin standardmäßig Klassen versiegelt. Das
open
Schlüsselwort ist das Gegenteil von Javafinal
odersealed
C # . (Natürlich gibt es keine allgemeine Übereinstimmung darüber, dass dies eine gute Sache ist .)quelle
Das Markieren einer Klasse als
Sealed
verhindert das Manipulieren wichtiger Klassen, die die Sicherheit gefährden 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.
Zum Beispiel bietet der
System
Namespace inC#
viele Klassen, die versiegelt sind, wie zString
. Wenn es nicht versiegelt ist, könnte es seine Funktionalität erweitern, was unerwünscht sein könnte, da es sich um einen grundlegenden Typ mit gegebener Funktionalität handelt.Ebenso sind
structures
inC#
immer implizit versiegelt. Daher kann man eine Struktur / Klasse nicht von einer anderen Struktur ableiten. Der Grund dafür ist, dassstructures
nur eigenständige, atomare, benutzerdefinierte Datentypen modelliert werden, die wir nicht ändern möchten.Wenn Sie Klassenhierarchien erstellen, möchten Sie manchmal einen bestimmten Zweig in der Vererbungskette basierend auf Ihrem Domänenmodell oder Ihren Geschäftsregeln abschließen.
Zum Beispiel sind a
Manager
undPartTimeEmployee
beideEmployee
s, aber Sie haben nach Teilzeitbeschäftigten in Ihrer Organisation keine Rolle mehr. In diesem Fall möchten Sie möglicherweise versiegelnPartTimeEmployee
, um eine weitere Verzweigung zu verhindern. Wenn Sie jedoch stündliche oder wöchentliche Teilzeitbeschäftigte haben, kann es sinnvoll sein, diese zu erbenPartTimeEmployee
.quelle
unseal
Bei Bedarf ist es für die Klasse später einfacher , als sie zu versiegeln und alle davon abhängigen Klassen zu brechen.Ich denke, dieser Beitrag hat einen guten Punkt. Der spezielle Fall war, als versucht wurde, eine nicht versiegelte Klasse in eine zufällige Schnittstelle umzuwandeln. Der Compiler gibt keinen Fehler aus. Wenn jedoch versiegelt verwendet wird, gibt der Compiler einen Fehler aus, den er nicht konvertieren kann. Die versiegelte Klasse bietet zusätzliche Sicherheit für den Codezugriff.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla
quelle