Em C # e C ++ / CLI, a palavra-chave sealed
(ou NotInheritable
em VB) é usada para proteger uma classe de qualquer chance de herança (a classe não será herdável). Eu sei que um recurso da programação orientada a objetos é a herança e acho que o uso de sealed
vai contra esse recurso, ele interrompe a herança. Existe um exemplo que mostra o benefício sealed
e quando é importante usá-lo?
87
Um adendo à excelente resposta de Babuíno :
Em uma nota relacionada, aplicável apenas a classes não lacradas: qualquer método criado
virtual
é um ponto de extensão, ou pelo menos parece que deveria ser um ponto de extensão. Declarar métodos tambémvirtual
deve ser uma decisão consciente. (Em C #, essa é uma decisão consciente; em Java, não.)EDIT : Alguns links relevantes:
Observe também que Kotlin sela classes por padrão; sua
open
palavra-chave é o oposto de Javafinal
ousealed
C # . (Com certeza, não existe um acordo universal de que isso é uma coisa boa .)fonte
Marcar uma classe como
Sealed
impede a violação de classes importantes que podem comprometer a segurança ou afetar o desempenho.Muitas vezes, selar uma classe também faz sentido quando se está projetando uma classe de utilitário com comportamento fixo, que não queremos alterar.
Por exemplo, o
System
namespace emC#
fornece muitas classes que são lacradas, comoString
. Se não fosse lacrado, seria possível estender sua funcionalidade, o que pode ser indesejável, pois é um tipo fundamental com determinada funcionalidade.Da mesma forma,
structures
inC#
são sempre selados implicitamente. Portanto, não se pode derivar uma estrutura / classe de outra estrutura. O motivo para isso é questructures
são usados para modelar apenas tipos de dados autônomos, atômicos e definidos pelo usuário , que não queremos modificar.Às vezes, quando você está construindo hierarquias de classes, você pode querer limitar um determinado ramo na cadeia de herança, com base em seu modelo de domínio ou regras de negócios.
Por exemplo, a
Manager
ePartTimeEmployee
são ambosEmployee
, mas você não tem nenhuma função depois de funcionários de meio período em sua organização. Nesse caso, você pode querer selarPartTimeEmployee
para evitar mais ramificações. Por outro lado, se você tiver funcionários horistas ou semanais em tempo parcial, pode fazer sentido herdá-losPartTimeEmployee
.fonte
unseal
a classe mais tarde, se necessário, ao invés de lacrá-la e quebrar todas as classes que dependem dela.Acho que esse post tem algum ponto bom, o caso específico foi ao tentar lançar uma classe não lacrada para qualquer interface aleatória, o compilador não gera erro; mas quando selado é usado, o compilador gera um erro que não pode ser convertido. Classe selada traz segurança de acesso de código adicional.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla
fonte