Ir para o conteúdo do rodapé
AJUDA DO .NET

Classes seladas em C# (Como funciona para desenvolvedores)

No mundo da programação orientada a objetos, a linguagem C# oferece aos desenvolvedores um conjunto versátil de ferramentas para projetar e implementar softwares robustos. Uma dessas características que adiciona uma camada extra de controle à herança de classes é o conceito de classe selada. Classes seladas oferecem uma maneira única de restringir a hierarquia de herança, proporcionando um nível de segurança e encapsulamento que pode ser benéfico em determinados cenários. Neste artigo, vamos nos aprofundar nas complexidades das classes seladas em C# e também explorar o pacote NuGet IronPDF da Iron Software .

O que são classes seladas e métodos selados?

Classe selada: Em C#, uma classe selada é uma classe que não pode ser herdada. Ao usar a palavra-chave sealed, os desenvolvedores podem impedir que outras classes derivem ou estendam a classe selada. Essa restrição deliberada garante que a classe selada não possa ser usada como classe base para nenhuma outra classe, limitando o escopo da hierarquia de herança. Classes seladas são frequentemente empregadas quando um desenvolvedor deseja controlar e finalizar a estrutura de uma classe, impedindo modificações não intencionais por meio de herança.

Considere o seguinte exemplo:

public sealed class Animal
{
    public string Species { get; set; }

    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

// The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
// public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
// {
// }
public sealed class Animal
{
    public string Species { get; set; }

    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

// The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
// public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
// {
// }
Public NotInheritable Class Animal
	Public Property Species() As String

	Public Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class

' The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
' public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
' {
' }
$vbLabelText   $csharpLabel

Ao contrário das structs, que são implicitamente seladas, a classe selada precisa ser declarada usando a palavra-chave sealed, como mostrado acima. Neste exemplo, a classe Animal é declarada como selada, tornando impossível que qualquer outra classe herde dela.

Método selado: Além de selar classes inteiras, o C# também permite que os desenvolvedores selem métodos individuais dentro de uma classe. Um método selado é um método que nenhuma classe derivada pode sobrescrever. Isso garante que o comportamento do método permaneça consistente em todas as subclasses, proporcionando um nível de previsibilidade na lógica da aplicação.

Para selar um método, use o modificador sealed:

public class Animal
{
    public string Species { get; set; }

    // A virtual method allows derived classes to override it.
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

public class Dog : Animal
{
    // The sealed override prevents further overriding of this method.
    public sealed override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}
public class Animal
{
    public string Species { get; set; }

    // A virtual method allows derived classes to override it.
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

public class Dog : Animal
{
    // The sealed override prevents further overriding of this method.
    public sealed override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}
Public Class Animal
	Public Property Species() As String

	' A virtual method allows derived classes to override it.
	Public Overridable Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class

Public Class Dog
	Inherits Animal

	' The sealed override prevents further overriding of this method.
	Public NotOverridable Overrides Sub MakeSound()
		Console.WriteLine("Bark!")
	End Sub
End Class
$vbLabelText   $csharpLabel

A palavra-chave virtual permite que o método seja sobrescrito em classes derivadas, enquanto a palavra-chave sealed impede a sobrescrita do método virtual da classe base em quaisquer subclasses subsequentes.

Classes seladas e membros de classe: Classes seladas também podem incluir membros selados, como propriedades, métodos e eventos. Essa combinação de classe selada e membros selados garante um alto grau de controle sobre o comportamento e a estrutura da classe.

Considere o seguinte exemplo:

public sealed class ControlledClass
{
    // A sealed property that prevents overriding.
    public sealed string ControlledProperty { get; set; }

    // A method that cannot be redefined by derived classes.
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
        Console.WriteLine("Executing controlled method.");
    }

    // A sealed event that cannot be subscribed to or raised by derived classes.
    public sealed event EventHandler ControlledEvent;

    // Sealed indexers, if applicable
    public sealed string this[int index]
    {
        get { return "Value"; }
        set 
        { 
            // Setter implementation 
        }
    }
}
public sealed class ControlledClass
{
    // A sealed property that prevents overriding.
    public sealed string ControlledProperty { get; set; }

    // A method that cannot be redefined by derived classes.
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
        Console.WriteLine("Executing controlled method.");
    }

    // A sealed event that cannot be subscribed to or raised by derived classes.
    public sealed event EventHandler ControlledEvent;

    // Sealed indexers, if applicable
    public sealed string this[int index]
    {
        get { return "Value"; }
        set 
        { 
            // Setter implementation 
        }
    }
}
Public NotInheritable Class ControlledClass
	' A sealed property that prevents overriding.
	Public NotOverridable Property ControlledProperty() As String

	' A method that cannot be redefined by derived classes.
	Public Overridable NotOverridable Sub ControlledMethod()
		' Method implementation
		Console.WriteLine("Executing controlled method.")
	End Sub

	' A sealed event that cannot be subscribed to or raised by derived classes.
	Public Event ControlledEvent As EventHandler

	' Sealed indexers, if applicable
	Default Public NotOverridable Property Item(ByVal index As Integer) As String
		Get
			Return "Value"
		End Get
		Set(ByVal value As String)
			' Setter implementation 
		End Set
	End Property
End Class
$vbLabelText   $csharpLabel

Neste exemplo, todos os aspectos do ControlledClass são selados – a propriedade, o método, o evento e até mesmo um indexador, se aplicável. Este nível de vedação proporciona uma estrutura robusta e inalterável, ideal para cenários em que o design da classe deve permanecer fixo.

A lógica por trás das classes seladas

Segurança do código: Classes seladas contribuem para a segurança do código, impedindo o acesso e a modificação não autorizados. Quando uma classe é selada, ela funciona como uma entidade fechada com uma interface e um comportamento bem definidos. Esse encapsulamento minimiza o risco de efeitos colaterais ou alterações indesejadas que possam comprometer a estabilidade e a segurança da base de código.

Integridade do projeto: Em bases de código ou frameworks maiores, manter a integridade do projeto é fundamental. Uma classe selada funciona como um bloco de construção fundamental com estruturas fixas, reduzindo as chances de modificações não intencionais. Isso é particularmente benéfico em cenários onde uma classe serve como componente central de um sistema e seu comportamento deve permanecer consistente em diferentes módulos.

Melhores práticas para usar classes seladas

  1. Use a classe Selada com moderação: Embora a classe Selada ofereça benefícios, eles devem ser empregados criteriosamente. O uso excessivo de classes seladas pode levar a um código rígido e menos fácil de manter.
  2. Documentar a intenção: Ao selar uma classe ou método, é crucial documentar a intenção por trás dessa decisão. Explique por que uma determinada classe é selada e quais considerações de projeto levaram a essa escolha.
  3. Considere a extensibilidade futura: Antes de selar uma classe, considere se requisitos futuros podem exigir extensibilidade. Se houver probabilidade de uma classe precisar ser estendida, selá-la pode dificultar o desenvolvimento futuro.
  4. Use métodos selados para estabilidade: Os métodos selados podem ser benéficos quando o comportamento principal de um método deve permanecer estável em diferentes subclasses. Isso pode melhorar a previsibilidade do código.
  5. Não pode ser abstrata: Uma classe selada/métodos selados não podem ser também uma classe abstrata/métodos abstratos, pois as classes abstratas são projetadas para serem herdadas por outras classes, enquanto as classes seladas restringem a herança.

Apresentando o IronPDF

Classe Selada em C# (Como Funciona para Desenvolvedores): Figura 1 - Página web do IronPDF

IronPDF é uma biblioteca C# para PDF da Iron Software , sendo um gerador e leitor de PDF moderno.

Instalação

O IronPDF pode ser instalado usando o console do Gerenciador de Pacotes NuGet ou o gerenciador de pacotes do Visual Studio. Abaixo está o comando para o console:

Install-Package IronPdf

Ou, para instalar o IronPDF usando o Gerenciador de Pacotes NuGet , pesquise "IronPDF" na barra de pesquisa do Gerenciador de Pacotes NuGet .

Classe Selada em C# (Como Funciona para Desenvolvedores): Figura 2 - Instalando a biblioteca IronPDF através do gerenciador de pacotes NuGet

IronPDF e Classes Seladas

Em conjunto, a palavra-chave sealed e o IronPDF podem ser usados ​​para impedir que uma biblioteca de subclasse ou uma biblioteca derivada sobrescreva membros herdados e também para gerar PDFs.

namespace OrderBy
{
    public class Program
    {
        static void Main()
        {
            Console.WriteLine("Demo Sealed Class and IronPdf");
            var dog = new Dog();
            dog.MakeSound();
            dog.Print();
        }
    }

    // Base class
    public class Animal
    {
        public string Species { get; set; }

        public virtual void MakeSound()
        {
            Console.WriteLine("Generic animal sound");
        }

        public virtual void Print()
        {
            Console.WriteLine("Generic animal Print");
        }
    }

    public class Dog : Animal
    {
        // Sealed override ensures method cannot be overridden in further derived classes.
        public sealed override void MakeSound()
        {
            Console.WriteLine("Bark!");
        }

        public sealed override void Print()
        {
            var pdfRenderer = new ChromePdfRenderer();
            string content = @"
            <!DOCTYPE html>
            <html>
            <body>
                <h1>Hello, Dog!</h1>
                <p>This is Print from Derived class.</p>
                <p>Print Animal Dog</p>
                <p>Print Animal Sound: Bark</p>
            </body>
            </html>";

            pdfRenderer.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
        }
    }
}
namespace OrderBy
{
    public class Program
    {
        static void Main()
        {
            Console.WriteLine("Demo Sealed Class and IronPdf");
            var dog = new Dog();
            dog.MakeSound();
            dog.Print();
        }
    }

    // Base class
    public class Animal
    {
        public string Species { get; set; }

        public virtual void MakeSound()
        {
            Console.WriteLine("Generic animal sound");
        }

        public virtual void Print()
        {
            Console.WriteLine("Generic animal Print");
        }
    }

    public class Dog : Animal
    {
        // Sealed override ensures method cannot be overridden in further derived classes.
        public sealed override void MakeSound()
        {
            Console.WriteLine("Bark!");
        }

        public sealed override void Print()
        {
            var pdfRenderer = new ChromePdfRenderer();
            string content = @"
            <!DOCTYPE html>
            <html>
            <body>
                <h1>Hello, Dog!</h1>
                <p>This is Print from Derived class.</p>
                <p>Print Animal Dog</p>
                <p>Print Animal Sound: Bark</p>
            </body>
            </html>";

            pdfRenderer.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
        }
    }
}
Namespace OrderBy
	Public Class Program
		Shared Sub Main()
			Console.WriteLine("Demo Sealed Class and IronPdf")
			Dim dog As New Dog()
			dog.MakeSound()
			dog.Print()
		End Sub
	End Class

	' Base class
	Public Class Animal
		Public Property Species() As String

		Public Overridable Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub

		Public Overridable Sub Print()
			Console.WriteLine("Generic animal Print")
		End Sub
	End Class

	Public Class Dog
		Inherits Animal

		' Sealed override ensures method cannot be overridden in further derived classes.
		Public NotOverridable Overrides Sub MakeSound()
			Console.WriteLine("Bark!")
		End Sub

		Public NotOverridable Overrides Sub Print()
			Dim pdfRenderer = New ChromePdfRenderer()
			Dim content As String = "
            <!DOCTYPE html>
            <html>
            <body>
                <h1>Hello, Dog!</h1>
                <p>This is Print from Derived class.</p>
                <p>Print Animal Dog</p>
                <p>Print Animal Sound: Bark</p>
            </body>
            </html>"

			pdfRenderer.RenderHtmlAsPdf(content).SaveAs("dog.pdf")
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

Classe Selada em C# (Como Funciona para Desenvolvedores): Figura 3 - Saída do console, mostrando o comando de execução e quaisquer mensagens resultantes no console

Abaixo está o PDF gerado pelo IronPDF.

Classe Selada em C# (Como Funciona para Desenvolvedores): Figura 4 - PDF gerado com o exemplo de código anterior

Licenciamento (Teste Gratuito Disponível)

IronPDF . Essa chave precisa ser inserida no arquivo appsettings.json.

{
    "IronPdf.LicenseKey": "your license key"
}

Forneça seu e-mail para obter uma licença de avaliação.

Conclusão

As classes seladas em C# oferecem aos desenvolvedores um mecanismo poderoso para controlar a hierarquia de herança e garantir que determinadas classes e seus membros não possam ser estendidos ou sobrescritos. Embora o uso de classes seladas deva ser cuidadosamente considerado, elas fornecem um meio eficaz de encapsular funcionalidades e evitar modificações não intencionais. Ao compreender o conceito de classes e métodos selados, os desenvolvedores podem tomar decisões informadas sobre quando e onde aplicar essa restrição, contribuindo para a criação de sistemas de software sustentáveis, seguros e previsíveis. Juntamente com o IronPDF, também podemos imprimir documentos PDF.

Perguntas frequentes

Como funciona uma classe selada em C#?

Em C#, uma classe selada é definida usando a palavra-chave sealed . Isso impede que outras classes herdem dela, garantindo que a implementação da classe permaneça inalterada.

Por que os desenvolvedores devem usar classes seladas em C#?

Classes seladas são usadas para manter a integridade do código, impedindo a herança. Isso garante que o comportamento da classe permaneça consistente e seguro, especialmente em sistemas maiores onde a integridade do projeto é crucial.

Classes seladas podem ter métodos que também são selados?

Sim, classes seladas podem conter métodos que também são selados. Isso significa que esses métodos não podem ser sobrescritos em classes derivadas, aumentando ainda mais a segurança e a consistência da funcionalidade da classe.

Qual a vantagem de usar métodos selados em uma classe?

Métodos selados impedem a sobrescrita por classes derivadas, o que ajuda a manter o comportamento original do método, garantindo consistência e protegendo contra modificações não intencionais.

Você pode fornecer exemplos de quando usar classes seladas?

Classes seladas são úteis quando você deseja restringir a implementação de uma classe para evitar alterações por meio de herança, como em classes utilitárias ou ao trabalhar com operações sensíveis onde a estabilidade é necessária.

Como as classes seladas se relacionam com a geração de PDFs em C#?

Ao usar uma biblioteca de PDF como o IronPDF, as classes seladas podem ser aproveitadas para garantir que os processos de geração de PDF permaneçam consistentes e seguros, impedindo modificações por meio de herança.

É possível usar classes seladas com bibliotecas de terceiros como o IronPDF?

Sim, classes seladas podem ser usadas em conjunto com bibliotecas de terceiros, como o IronPDF, para encapsular a lógica de geração de PDFs dentro de uma estrutura de classes segura e não herdável.

Como posso instalar uma biblioteca PDF em C# usando o NuGet?

Você pode instalar uma biblioteca C# para PDF, como o IronPDF, através do Gerenciador de Pacotes NuGet, usando o comando dotnet add package IronPDF ou pesquisando por 'ironpdf' no Gerenciador de Pacotes NuGet do Visual Studio.

Quais são as considerações para o uso de classes seladas no projeto de software?

Os desenvolvedores devem considerar a necessidade de extensibilidade futura e documentar os motivos para o uso de classes seladas. O uso de classes seladas pode aumentar a segurança e a facilidade de manutenção, mas deve ser equilibrado com a flexibilidade exigida pela aplicação.

Qual é o gerador de PDF recomendado para desenvolvedores C#?

IronPDF é um gerador de PDF recomendado para desenvolvedores C#, oferecendo recursos robustos de criação e manipulação de PDFs como um pacote NuGet.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim