Eine Klasse zu versiegeln ist nicht etwas, auf das ich in der Vergangenheit viel geachtet habe, aber ich frage mich, was ist die beste Praxis. Wenn Sie wissen, dass eine Klasse nicht abgeleitet werden würde oder nicht, würden Sie sie vorsorglich versiegeln, um das versiegelte Schlüsselwort aus dem Wissen zu entfernen, dass die Wahrscheinlichkeit, dass jemand versucht, daraus abzuleiten, gering ist.
Ich denke, was ich verlange ist, sollten Sie alle Klassen, die nicht zur Vererbung bestimmt sind, als eine gute Praxis versiegeln?
Sie sollten nicht willkürlich alle Klassen versiegeln, die nicht zu einem bestimmten Zeitpunkt vererbt werden sollen.
Stattdessen sollten Siegelklassen, die Sie kennen, NIEMALS vererbt werden und die anderen offen lassen. Wenn zu einem späteren Zeitpunkt eine Entscheidung getroffen werden kann, dass diese Klassen NIEMALS von Ihnen geerbt werden sollen, können Sie sie dann versiegeln.
Wenn Sie dem Prinzip open / closed genau folgen, sollte das versiegelte Schlüsselwort niemals verwendet werden. Aber ich denke, es gibt immer Eckenfälle.
Im Anwendungscode, in dem der gesamte von Ihrer Klasse abgeleitete Code von Ihnen selbst gesteuert wird, lasse ich die meisten Klassen standardmäßig offen. Wenn Sie Code, der von Ihrer Klasse abgeleitet ist, durch Ändern der Basisklasse brechen, können Sie ihn einfach reparieren.
Aber Dichtung ist sehr nützlich im Bibliothekscode. Wenn Sie eine Klasse unversiegelt lassen, versprechen Sie, keinen Code zu brechen, der sich daraus ergibt. d. h. Sie erhöhen Ihre öffentliche Fläche. IMO-Bibliotheken sollten die Oberfläche standardmäßig minimal halten, was eine Versiegelung bedeutet.
Aber es ist nicht immer notwendig, die gesamte Klasse zu versiegeln. Es kann ausreichen, um einige oder alle virtuellen Methoden zu versiegeln. Auf diese Weise kann Code, der von Ihrer Klasse abgeleitet ist, diesen nur erweitern, aber nicht die aktuelle Funktionalität durch Überschreiben einer Methode ändern.
Eine andere Art von Klasse, die oft versiegelte Klassen mit Wert Semantik sein sollte. Es ist viel schwieriger, korrekte Gleichheits- und Pseudo-Mutatoren für nicht versiegelte Klassen zu implementieren. Also versiegele ich sie einfach und vermeide die zusätzliche Arbeit, wenn sie nicht wirklich notwendig ist.
Ich werde dir keine klare Antwort geben, aber hier sind einige Dinge zu beachten:
Versiegelte Klassen können Ihnen einen (geringen) Leistungsvorteil bringen. Sieh diesen Thread:
bieten versiegelte Klassen wirklich Vorteile?
>Versiegelte Klassen beeinträchtigen häufig die gängigen Mock-Frameworks, die durch Unterklassenbildung implementiert werden.
Für weitere Informationen:
Warum existiert das Schlüsselwort 'sealed' in .Net?
In der Praxis versiegele ich oft nicht Klassen.
Das einzige Mal, wo ich feststelle, dass eine Klasse versiegelt ist, ist, wenn ich wirklich etwas daraus ableiten muss, aber dann finde ich heraus, dass ich es nicht kann.
Ich habe nie das Bedürfnis verspürt, meine eigenen Klassen zu versiegeln. Ich denke einfach nicht, dass ich schlau genug bin, um zu wissen, wann eine Klasse niemals abgeleitet werden sollte. Ich bin ziemlich schlau, aber ich kann die Zukunft nicht sagen.
Es kann sinnvoll sein, Kern-.NET-Framework-Klassen zu versiegeln, damit sie das Verhalten des Frameworks genau steuern können, aber ich habe noch nie einen Fall gesehen, in dem ein gewöhnlicher Entwickler dies tun müsste. Vielleicht möchten Sie es abraten, eine Klasse abzuleiten, aber sie zu schließen, ist ziemlich endgültig und wer weiß, was Ihre Bedürfnisse nächste Woche / Monat / Jahr / Lebenszeit sind?
Tags und Links c# design-patterns