Eu gostaria de ouvir qual é a motivação por trás da maioria das classes seladas na estrutura .Net. Qual é a vantagem de selar uma classe? Não consigo entender como não permitir a herança pode ser útil e provavelmente não o único a lutar contra essas classes.
Então, por que a estrutura foi projetada dessa maneira e não seria uma mudança inabalável desmarcar tudo? Deve haver outro motivo, mas apenas ser mau?
.net
performance
mmiika
fonte
fonte
Respostas:
O artigo do MSDN para este tópico é Limitando a extensibilidade por classes de vedação .
fonte
As classes devem ser projetadas para herança ou proibi-la. Há um custo para projetar para herança:
O item 17 do Effective Java fornece mais detalhes sobre isso - independentemente do fato de ter sido escrito no contexto do Java, o conselho também se aplica ao .NET.
Pessoalmente, gostaria que as classes fossem lacradas por padrão no .NET.
fonte
Parece que as diretrizes oficiais da Microsoft sobre vedação evoluíram desde que essa pergunta foi feita há cerca de 9 anos, e mudaram de uma filosofia de aceitação (selar por padrão) para cancelar (não selar por padrão):
Na verdade, se você pesquisar a base de código ASP.Net Core , encontrará apenas cerca de 30 ocorrências de
sealed class
, a maioria das quais são atributos e classes de teste.Eu realmente acho que a conservação da imutabilidade é um bom argumento a favor da vedação.
fonte
Encontrei esta frase na documentação do msdn: "Classes seladas são usadas principalmente para evitar derivação. Como nunca podem ser usadas como classe base, algumas otimizações de tempo de execução podem tornar a chamada de membros de classe selada um pouco mais rápida."
Não sei se a atuação é a única vantagem das aulas fechadas e pessoalmente também gostaria de saber outros motivos ...
fonte
O desempenho é um fator importante, por exemplo, a classe da string em java é final (<- selada) e a razão para isso é apenas o desempenho. Acho que outro ponto importante é evitar o problema da classe base frágil descrito em detalhes aqui: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes. aspx
Se você fornecer uma estrutura, é importante para projetos legados de manutenção e atualizar sua estrutura para evitar o problema da classe base frágil
fonte
String
classe pode nem ser possível subclassificar, mesmo que não seja final.Selado é usado para evitar o "problema da classe base frágil". Eu encontrei um bom artigo no MSDN que explica isso.
fonte
A vedação permite que você obtenha alguns pequenos ganhos de desempenho. Isso é menos verdadeiro no mundo dos JITs e da pessimização preguiçosa do que no mundo, digamos, do C ++, mas como o .NET não é tão bom quanto a pessimização como os compiladores Java são, principalmente por causa de diferentes filosofias de design, ele ainda é útil. Diz ao compilador que pode chamar diretamente quaisquer métodos virtuais em vez de chamá-los indiretamente por meio da vtable.
Também é importante quando você deseja um 'mundo fechado' para coisas como comparação de igualdade. Normalmente, uma vez que defino um método virtual, fico muito preocupado em definir uma noção de comparação de igualdade que realmente implemente a ideia. Por outro lado, posso ser capaz de defini-lo para uma subclasse específica da classe com o método virtual. Selar essa classe garante que a igualdade realmente se mantenha.
fonte
Selar uma classe torna o gerenciamento de recursos descartáveis mais fácil.
fonte
Para determinar se deve selar uma classe, método ou propriedade, você geralmente deve considerar os seguintes dois pontos:
• Os benefícios potenciais que classes derivadas podem obter por meio da capacidade de personalizar sua classe.
• O potencial de que classes derivadas podem modificar suas classes de tal forma que elas não funcionem mais corretamente ou conforme o esperado.
fonte
Outra consideração é que as classes lacradas não podem ser fragmentadas em seus testes de unidade. Da documentação da Microsoft :
fonte