W C # i C ++ / CLI słowo kluczowe sealed
(lub NotInheritable
w VB) służy do ochrony klasy przed jakąkolwiek szansą na dziedziczenie (klasa nie będzie dziedziczona). Wiem, że jedną z cech programowania obiektowego jest dziedziczenie i czuję, że użycie sealed
jest sprzeczne z tą funkcją, zatrzymuje dziedziczenie. Czy istnieje przykład, który pokazuje korzyści sealed
i kiedy ważne jest, aby z niego korzystać?
Dodatek do doskonałej odpowiedzi Baboon :
W związku z tym, ma zastosowanie tylko do niezapieczętowanych klas: każda utworzona metoda
virtual
jest punktem rozszerzenia lub przynajmniej wygląda na to, że powinna być punktem rozszerzenia. Deklarowanie metod równieżvirtual
powinno być świadomą decyzją. (W C # jest to świadoma decyzja; w Javie tak nie jest).EDYCJA : Kilka odpowiednich linków:
Należy również zauważyć, że Kotlin domyślnie pieczętuje klasy; jego
open
słowo kluczowe jest przeciwieństwem języka Javafinal
lubsealed
C # . (Z pewnością nie ma powszechnej zgody, że to dobra rzecz ).źródło
Oznaczenie klasy jako
Sealed
zapobiega manipulowaniu ważnymi klasami, które mogą zagrozić bezpieczeństwu lub wpłynąć na wydajność.Często zapieczętowanie klasy ma również sens, gdy projektujemy klasę użytkową o stałym zachowaniu, którego nie chcemy zmieniać.
Na przykład
System
przestrzeń nazw wC#
zawiera wiele klas, które są zapieczętowane, takie jakString
. Gdyby nie był zamknięty, możliwe byłoby rozszerzenie jego funkcjonalności, co mogłoby być niepożądane, ponieważ jest to typ podstawowy o danej funkcjonalności.Podobnie,
structures
wC#
są zawsze domyślnie zapieczętowane. Dlatego nie można wyprowadzić jednej struktury / klasy z innej struktury. Powodem tego jest to, żestructures
są one używane do modelowania tylko samodzielnych, niepodzielnych, zdefiniowanych przez użytkownika typów danych, których nie chcemy modyfikować.Czasami podczas budowania hierarchii klas możesz chcieć ograniczyć określoną gałąź w łańcuchu dziedziczenia na podstawie modelu domeny lub reguł biznesowych.
Na przykład, a
Manager
iPartTimeEmployee
są obaEmployee
, ale nie pełnisz żadnej roli po pracownikach zatrudnionych w niepełnym wymiarze godzin w Twojej organizacji. W takim przypadku możesz chcieć zapieczętować,PartTimeEmployee
aby zapobiec dalszemu rozgałęzianiu. Z drugiej strony, jeśli masz pracowników zatrudnionych w niepełnym wymiarze godzinowym lub tygodniowym, warto odziedziczyć ich poPartTimeEmployee
.źródło
unseal
Jeśli zajdzie taka potrzeba, łatwiej będzie później klasie niż zapieczętować ją i rozbić wszystkie klasy, które od niej zależą.Myślę, że ten post ma dobry punkt, konkretny przypadek dotyczył próby rzutowania niezamykanej klasy na dowolny przypadkowy interfejs, kompilator nie zgłasza błędu; ale kiedy jest używany Seal, kompilator zgłasza błąd, którego nie może przekonwertować. Klasa Sealed zapewnia dodatkowe zabezpieczenie dostępu do kodu.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla
źródło