Classes e métodos sealed em C# com Unity/XLua

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 sealed acelera 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.

Tags: C# sealed Unity XLua OOP

Publicado em 7-20 03:25