C# -  Classes (e métodos) seladas
 Neste artigo vamos recordar o conceito de classes seladas na linguagem C# , como e o porque usá-las.


Em alguns cenários não queremos permitir que outros programadores estendam nossas classes e, felizmente, a linguagem C# fornece um recurso útil para ajudar a evitar a herança de classes através do modificador sealed.

O objetivo de tornar uma classe selada é indicar que a classe é uma classe especial que impede que ela seja estendida para fornecer qualquer funcionalidade adicional a outras classes por meio de herança. Os desenvolvedores não apenas podem selar uma classe, mas também podem impedir a substituição de métodos e propriedades.

 

A palavra-chave sealed
 

Podemos selar uma classe usando a palavra-chave sealed da seguinte forma:

 

sealed class MinhaClasseSelada1
{
    public string? Nome { get; set; }
    public string? Email { get; set; }
    public int Idade { get; set; }
}

sealed public class MinhaClasseSelada2
{
    // implementação
}


Como você já deve saber, a palavra-chave sealed é usada para bloquear uma classe, portanto, certifique-se de que a classe que você vai selar não seja a classe base de nenhuma outra classe.

 

O exemplo de código a seguir, criado no .NET 6,  mostra como você pode definir uma classe selada em C#:
 

AlunoDetalhes aluno = new();

aluno.GetDetalhes();  // OK
aluno.GetNome();     
// Error

Console.ReadLine();

sealed class Aluno
{
    public string Nome = "Paulo Ricardo";

    public void GetNome()
    {
        Console.WriteLine($"Nome: {Nome}");
    }
}

public class AlunoDetalhes : Aluno
{
    public int Idade = 22;
    public string Cidade = "São Paulo";

    public void GetDetalhes()
    {
        Console.WriteLine($"Idade : {Idade}");
        Console.WriteLine($"Cidade: {Cidade}");
    }
}

Neste código definimos a classe Aluno como selada usando o modificador sealed.

A seguir estamos tentando herdar as propriedades da classe Aluno na classe AlunoDetalhes usando herança.

Depois criamos uma instância da classe AlunoDetalhes e estamos invocando os métodos GetDetalhes() e GetNome().

Ao compilar o código acima iremos obter os seguintes erros:

Estes erros ocorrem em tempo de compilação e informam que as propriedades da classe selada Aluno não podem ser herdadas na classe AlunoDetalhes e com isso temos que a classe AlunoDetalhes não contém acesso ao método GetNome() que seria obtida da classe Aluno. No entanto a classe acessa o seu próprio método GetDetalhes.

Além disso você também pode usar o modificador sealed em um método ou propriedade que substitui um método ou propriedade virtual em uma classe base. Com isso, você pode permitir que classes sejam derivadas de sua classe e impedir que substituam métodos ou propriedades virtuais.

Vejamos um exemplo usando esta abordagem:

1- Vamos criar a classe Eletronicos contendo o método virtual Teste

2- A seguir vamos criar a classe Televisao que herda de Eletronicos e sobrescreve o método Teste mas usa o modificador sealed no método

3- Finalmente vamos criar a classe LCD que herda Televisao e tenta sobrescrever o método Teste

Como vemos o compilador emite um alerta indicando que o não podemos sobrescrever o método Teste herdado da classe Televisao pois ele é selado.

Ao definir novos métodos ou propriedades em uma classe, você pode impedir que classes derivadas os substituam não declarando-os como virtuais.

É um erro usar o modificador abstract com uma classe selada, porque uma classe abstrata deve ser herdada por uma classe que fornece uma implementação dos métodos ou propriedades abstratas.

Quando aplicado a um método ou propriedade, o modificador sealed sempre deve ser usado com override.

Nosso código ficaria mais ajustado da seguinte forma:

class Electronicos
{
    protected virtual void Teste()
    {
        Console.WriteLine("Método virtual Teste da classe Eletronicos");
    }
}

class Televisao : Electronicos
{
    // método selado
    sealed protected override void Teste()
    {
        Console.WriteLine("Método Teste na classe Televisao");
    }
}

class LCD : Televisao
{
    protected override void Teste()
    {  // tentando sobrescrever o método selado
        Console.WriteLine("Método Teste na classe LCD");
    }
}

O modificador protected é usado para especificar que o tipo ou membro só pode ser acessado por um código na mesma classe ou em uma classe derivada.

Para determinar se uma classe, método ou propriedade deve ser selada, você geralmente deve considerar os dois pontos a seguir:

  1. Os benefícios potenciais que as classes derivadas podem obter por meio da capacidade de personalizar sua classe;
  2. O potencial de que classes derivadas possuem de modificar suas classes de forma que elas não funcionem mais corretamente ou conforme o esperado;

E estamos conversados...


"Revesti-vos, pois, como eleitos de Deus, santos e amados, de entranhas de misericórdia, de benignidade, humildade, mansidão, longanimidade;"
Colossenses 3:12

Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6
Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6

Referências:


José Carlos Macoratti