webentwicklung-frage-antwort-db.com.de

Wann und warum würdest du eine Klasse besiegeln?

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?

79
Aan
  1. In einer Klasse, die Sicherheitsfunktionen implementiert, so dass das ursprüngliche Objekt nicht als "Identität angenommen" werden kann.

  2. 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.

89
Louis Kottmann

Ein Nachtrag zu Baboons hervorragender Antwort:

  1. Wenn eine Klasse nicht designed zur Vererbung ist, können Unterklassen brechen Klasseninvarianten . Dies gilt natürlich nur, wenn Sie eine öffentliche API erstellen, aber als Faustregel versiegele ich jede Klasse, die nicht explizit als Unterklasse entworfen wurde.

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 .)

14

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 Employees, 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.

1
Akshay Khot

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

0
strisunshine