Saltar al pie de página
.NET AYUDA

C# Clase Sellada (Cómo Funciona para Desarrolladores)

En el mundo de la programación orientada a objetos, el lenguaje C# proporciona a los desarrolladores un conjunto versátil de herramientas para diseñar e implementar software robusto. Una de estas características que agrega una capa extra de control a la herencia de clases es el concepto de una clase sellada. Las clases selladas ofrecen una manera única de restringir la jerarquía de herencia, proporcionando un nivel de seguridad y encapsulación que puede ser beneficioso en ciertos escenarios. En este artículo, profundizaremos en las complejidades de las clases selladas de C# y también exploraremos el paquete IronPDF de NuGet de Iron Software.

¿Qué son las clases selladas y los métodos sellados?

Clase Sellada: En C#, una clase sellada es una clase que no puede ser heredada. Al usar la palabra clave sealed, los desarrolladores pueden prevenir que otras clases deriven o se extiendan desde la clase sellada. Esta restricción deliberada asegura que la clase sellada no pueda ser usada como clase base para ninguna otra clase, limitando el alcance de la jerarquía de herencia. Las clases selladas se emplean a menudo cuando un desarrollador quiere controlar y finalizar la estructura de una clase, evitando modificaciones no deseadas a través de la herencia.

Considera el siguiente ejemplo:

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

A diferencia de las estructuras, que están implícitamente selladas, la clase sellada debe ser declarada usando la palabra clave sealed como se muestra arriba. En este ejemplo, la clase Animal se declara como sellada, haciendo imposible que cualquier otra clase la herede.

Método Sellado: Además de sellar clases enteras, C# también permite a los desarrolladores sellar métodos individuales dentro de una clase. Un método sellado es un método que cualquier clase derivada no puede sobrescribir. Esto asegura que el comportamiento del método permanezca consistente en todas las subclases, proporcionando un nivel de previsibilidad en la lógica de la aplicación.

Para sellar un método, use el 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

La palabra clave virtual permite que el método sea sobrescrito en las clases derivadas, mientras que la palabra clave sealed previene la sobrescritura adicional del método virtual de la clase base en cualquier subclase posterior.

Clase Sellada y Miembros de Clase: Las clases selladas también pueden incluir miembros sellados, como propiedades, métodos y eventos. Esta combinación de clase sellada y miembros sellados asegura un alto grado de control sobre el comportamiento y la estructura de la clase.

Considera el siguiente ejemplo:

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

En este ejemplo, cada aspecto de la ControlledClass está sellado: la propiedad, el método, el evento e incluso un indexador si es aplicable. Este nivel de sellado proporciona una estructura robusta e inalterable, ideal para escenarios donde el diseño de la clase debe permanecer fijo.

La razón de ser de Sealed Class

Seguridad del Código: Las clases selladas contribuyen a la seguridad del código al prevenir el acceso y modificación no autorizados. Cuando una clase es sellada, sirve como una entidad cerrada con una interfaz y comportamiento bien definidos. Esta encapsulación minimiza el riesgo de efectos secundarios no deseados o alteraciones que podrían comprometer la estabilidad y seguridad de la base de código.

Integridad del Diseño: En bases de código o marcos de trabajo más grandes, mantener la integridad del diseño es primordial. Una clase sellada actúa como un bloque de construcción fundamental con estructuras fijas, reduciendo las posibilidades de modificaciones no deseadas. Esto es particularmente beneficioso en escenarios donde una clase sirve como un componente central de un sistema, y su comportamiento debe permanecer consistente a través de diferentes módulos.

Prácticas recomendadas para el uso de Sealed Class

  1. Usa la Clase Sellada con Moderación: Aunque la clase sellada ofrece beneficios, deben emplearse con juicio. El uso excesivo de clases selladas puede conducir a un código rígido y menos mantenible.
  2. Documenta la Intención: Al sellar una clase o método, es crucial documentar el propósito detrás de esta decisión. Explica por qué una clase específica está sellada y qué consideraciones de diseño llevaron a esa elección.
  3. Considera la Extensibilidad Futura: Antes de sellar una clase, considera si los requisitos futuros podrían necesitar extensibilidad. Si existe la posibilidad de que una clase necesite ser extendida, sellarla podría obstaculizar el desarrollo futuro.
  4. Usa Métodos Sellados para la Estabilidad: Sellar métodos puede ser beneficioso cuando el comportamiento central de un método debe permanecer estable a través de diferentes subclases. Esto puede mejorar la previsibilidad del código.
  5. No Puede Ser También Abstracto: Una clase sellada/métodos sellados no pueden ser también una clase abstracta/métodos abstractos, ya que las clases abstractas están diseñadas para ser heredadas por otras clases mientras que las clases selladas restringen la herencia.

Presentando IronPDF

Clase Sellada en C# (Cómo Funciona Para los Desarrolladores): Figura 1 - página de IronPDF

IronPDF es una biblioteca de PDF para C# de Iron Software y es un generador y lector de PDF moderno.

Instalación

IronPDF se puede instalar usando la consola del Administrador de Paquetes de NuGet o usando el administrador de paquetes de Visual Studio. A continuación se muestra el comando para la consola:

Install-Package IronPdf

O, para instalar IronPDF usando el Administrador de Paquetes NuGet, busca "IronPDF" en la barra de búsqueda del Administrador de Paquetes NuGet.

Clase Sellada en C# (Cómo Funciona Para los Desarrolladores): Figura 2 - Instalando la biblioteca IronPDF a través del administrador de paquetes NuGet

IronPDF y las clases selladas

Juntos, la palabra clave sellada y IronPDF se pueden usar para prevenir que una librería subclase o una librería derivada sobrescriba miembros heredados y también genere 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

Clase Sellada en C# (Cómo Funciona Para los Desarrolladores): Figura 3 - Salida de la consola, mostrando el comando de ejecución y cualquier mensaje resultante de la consola

PDF generado con IronPDF

Clase Sellada en C# (Cómo Funciona Para los Desarrolladores): Figura 4 - PDF generado con el ejemplo de código anterior

Licencia (Prueba gratuita disponible)

IronPDF. Esta clave debe colocarse en appsettings.json.

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

Proporcione su correo para una licencia de prueba.

Conclusión

Las clases selladas en C# ofrecen a los desarrolladores un mecanismo poderoso para controlar la jerarquía de herencia y asegurar que ciertas clases y sus miembros no puedan ser extendidos o sobrescritos. Si bien el uso de clases selladas debe ser considerado cuidadosamente, proporcionan un medio efectivo para encapsular funcionalidad y prevenir modificaciones no deseadas. Al entender el concepto de clases y métodos sellados, los desarrolladores pueden tomar decisiones informadas sobre cuándo y dónde aplicar esta restricción, contribuyendo a crear sistemas de software mantenibles, seguros y previsibles. Junto con IronPDF, también podemos imprimir documentos PDF.

Preguntas Frecuentes

¿Cómo funciona una clase sellada en C#?

En C#, una clase sellada se define utilizando la palabra clave sealed. Esto impide que otras clases hereden de ella, asegurando que la implementación de la clase permanezca inalterada.

¿Por qué deberían los desarrolladores usar clases selladas en C#?

Las clases selladas se utilizan para mantener la integridad del código evitando la herencia. Esto asegura que el comportamiento de la clase permanezca consistente y seguro, especialmente en sistemas grandes donde la integridad del diseño es crucial.

¿Pueden las clases selladas tener métodos que también estén sellados?

Sí, las clases selladas pueden contener métodos que están a su vez sellados. Esto significa que los métodos no pueden ser sobrescritos en clases derivadas, aumentando aún más la seguridad y consistencia de la funcionalidad de la clase.

¿Cuál es el beneficio de usar métodos sellados en una clase?

Los métodos sellados previenen la sobrescritura por clases derivadas, lo que ayuda a mantener el comportamiento original del método, asegurando consistencia y protegiendo contra modificaciones no intencionadas.

¿Puede proporcionar ejemplos de cuándo usar clases selladas?

Las clases selladas son útiles cuando se quiere fijar la implementación de una clase para evitar cambios a través de la herencia, como en clases de utilidades o al trabajar con operaciones sensibles donde se requiere estabilidad.

¿Cómo se relacionan las clases selladas con la generación de PDF en C#?

Al usar una biblioteca de PDF como IronPDF, las clases selladas pueden aprovecharse para asegurar que los procesos de generación de PDF permanezcan consistentes y seguros, al prevenir modificaciones a través de la herencia.

¿Es posible usar clases selladas con bibliotecas de terceros como IronPDF?

Sí, las clases selladas pueden usarse junto con bibliotecas de terceros como IronPDF para encapsular la lógica de generación de PDF dentro de una estructura de clase segura y no heredable.

¿Cómo puedo instalar una biblioteca de PDF en C# usando NuGet?

Puede instalar una biblioteca de PDF en C#, como IronPDF, a través del Administrador de Paquetes NuGet usando el comando dotnet add package IronPdf o buscando 'ironpdf' en el Administrador de Paquetes NuGet de Visual Studio.

¿Cuáles son las consideraciones para usar clases selladas en el diseño de software?

Los desarrolladores deben considerar la necesidad de extensibilidad futura y documentar las razones para sellar una clase. Usar clases selladas puede mejorar la seguridad y mantenibilidad, pero debe equilibrarse con la flexibilidad requerida por la aplicación.

¿Cuál es un generador de PDF recomendado para desarrolladores C#?

IronPDF es un generador de PDF recomendado para desarrolladores C#, proporcionando capacidades robustas de creación y manipulación de PDF como un paquete de NuGet.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más