Em C#, a palavra-chave sealed é usada para bloquear a herança de uma classe ou para impedir que uma redefinição de método seja novamente sobrescrita. Ela é útil quando queremos proteger uma implementação, melhorar a performance de reflection ou garantir que determinado comportamento não seja alterado por classes derivadas.
Situações em que o uso de sealed faz sentido incluem:
- A classe é estática (o próprio compilador já a trata como
abstract sealed). - A classe protege membros que contêm informações sensíveis.
- Um tipo possui vários membros virtuais e selar a classe inteira é mais prático do que selar cada membro individualmente.
- A classe representa um atributo acessado frequentemente por reflection, pois
sealedacelera a busca de atributos.
A sintaxe básica para declarar uma classe selada é:
modificador sealed class NomeDaClasse : BaseOuInterface
{
// membros da classe
}
No exemplo a seguir, ConfiguracaoAplicacao é uma classe selada, Carro demonstra um método selado e Funcionario combina ambos os conceitos:
using System;
namespace Exemplos.Sealed
{
// Classe selada: não pode ser herdada.
public sealed class ConfiguracaoAplicacao
{
public string Versao { get; set; } = "1.0";
public void Exibir()
{
Console.WriteLine($"Versão do aplicativo: {Versao}");
}
}
// Classe base com método virtual.
public class Veiculo
{
public virtual void Mover()
{
Console.WriteLine("Veículo em movimento.");
}
}
// Classe selada que impede nova herança.
public sealed class Carro : Veiculo
{
// Método selado: não pode ser sobrescrito novamente.
public sealed override void Mover()
{
base.Mover();
Console.WriteLine("Carro se locomovendo.");
}
}
// Tentar herdar de Carro geraria erro de compilação:
// public class CarroEsportivo : Carro { }
public class Pessoa
{
public virtual void ExibirDados()
{
Console.WriteLine("Dados da pessoa");
}
}
public sealed class Funcionario : Pessoa
{
public string Matricula { get; set; }
public string Nome { get; set; }
public sealed override void ExibirDados()
{
base.ExibirDados();
Console.WriteLine($"{Matricula} - {Nome}");
}
}
class Program
{
static void Main(string[] args)
{
var cfg = new ConfiguracaoAplicacao();
cfg.Exibir();
var carro = new Carro();
carro.Mover();
var funcionario = new Funcionario
{
Matricula = "1001",
Nome = "Nemo"
};
funcionario.ExibirDados();
}
}
}
No código acima, ConfiguracaoAplicacao e Funcionario são classes seladas, portanto nenhuma outra classe pode derivar delas. O método Mover em Carro e o método ExibirDados em Funcionario também são selados, impedindo que subclasses continuem a cadeia de sobresrcita. Quando um método selado é chamado, a execução pode ainda reaproveitar a implementação da classe base com base, como mostrado nos exemplos.