AYUDA .NET

C# Vitrual Vs Abstract (Cómo funciona para los desarrolladores)

Publicado en 29 de abril, 2024
Compartir:

En C#,métodos virtuales pueden sobrescribirse en las clases derivadas, mientras que los métodos abstractos deben sobrescribirse en las clases derivadas. Esto permite un comportamiento flexible y posibilita el polimorfismo en la programación orientada a objetos. Estos dos conceptos permiten la flexibilidad y la reutilización en la programación orientada a objetos. Este artículo explica las particularidades de los métodos abstractos y virtuales, proporcionando ejemplos claros y centrándose en sus usos prácticos en la codificación. También exploraremosFunciones y casos de uso de IronPDF más adelante en el artículo.

Clase y métodos abstractos

Una clase abstracta es un tipo especial de clase que no puede instanciarse directamente. En cambio, sirve de modelo para otras clases. Una clase abstracta puede contener métodos abstractos, que son métodos declarados en la clase abstracta pero que deben implementarse en las clases concretas derivadas.

public abstract class Vehicle
{
// abstract method to be implemented in non-abstract child class
    public abstract void DisplayInfo();
}
public abstract class Vehicle
{
// abstract method to be implemented in non-abstract child class
    public abstract void DisplayInfo();
}
Public MustInherit Class Vehicle
' abstract method to be implemented in non-abstract child class
	Public MustOverride Sub DisplayInfo()
End Class
VB   C#

En este ejemplo, la clase Vehicle es abstracta, y DisplayInfo es un método abstracto. El método DisplayInfo no tiene ninguna implementación en la clase Vehicle. Obliga a la clase derivada a proporcionar su definición de este método.

Métodos virtuales

Los métodos virtuales son métodos de una clase base que tienen una implementación por defecto pero que pueden ser sobrescritos en clases derivadas. La palabra clave virtual se utiliza para declarar un método como virtual. Las clases derivadas utilizan la palabra clave override para proporcionar una implementación específica del método, lo que ayuda a entender cómo una clase hija puede anular el método virtual de su padre.

// non-abstract class
public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Some generic animal sound");
    }
}
// non-abstract class
public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Some generic animal sound");
    }
}
' non-abstract class
Public Class Animal
	Public Overridable Sub Speak()
		Console.WriteLine("Some generic animal sound")
	End Sub
End Class
VB   C#

Aquí, la clase Animal tiene un método virtual Speak con una implementación por defecto. Las clases derivadas pueden anular el método para proporcionar un sonido animal específico utilizando la palabra clave override.

Combinación de métodos virtuales y abstractos

Una clase puede tener métodos abstractos y virtuales. Los métodos abstractos no tienen implementación y deben ser sobrescritos en las clases derivadas, mientras que los métodos virtuales tienen una implementación por defecto que las clases derivadas pueden sobrescribir opcionalmente.

Imagina que estás construyendo un sistema que modela distintos tipos de vehículos, cada uno con su forma de mostrar la información. A continuación se explica cómo utilizar métodos abstractos y virtuales:

public abstract class Vehicle
{
    // Abstract method
    public abstract void DisplayInfo();
    // Virtual method
    public virtual void StartEngine()
    {
        Console.WriteLine("Engine started with default configuration.");
    }
}
public abstract class Vehicle
{
    // Abstract method
    public abstract void DisplayInfo();
    // Virtual method
    public virtual void StartEngine()
    {
        Console.WriteLine("Engine started with default configuration.");
    }
}
Public MustInherit Class Vehicle
	' Abstract method
	Public MustOverride Sub DisplayInfo()
	' Virtual method
	Public Overridable Sub StartEngine()
		Console.WriteLine("Engine started with default configuration.")
	End Sub
End Class
VB   C#

En esta clase Vehicle, DisplayInfo es un método abstracto, obligando a todas las clases derivadas a implementar su forma de mostrar la información. Sin embargo, StartEngine proporciona una forma predeterminada de iniciar el motor, que puede ser sobrescrita por una clase heredada si es necesario.

Ejemplo con clases derivadas

Ahora, definamos una clase Car, una clase hija no abstracta que hereda de Vehicle e implementa el método abstracto y, opcionalmente, sobrescribe el método virtual:

public class Car : Vehicle
{
// public override void abstract method
    public override void DisplayInfo()
    {
        Console.WriteLine("This is a car.");
    }
    public override void StartEngine()
    {
        Console.WriteLine("Car engine started with custom settings.");
    }
}
public class Car : Vehicle
{
// public override void abstract method
    public override void DisplayInfo()
    {
        Console.WriteLine("This is a car.");
    }
    public override void StartEngine()
    {
        Console.WriteLine("Car engine started with custom settings.");
    }
}
Public Class Car
	Inherits Vehicle

' public override void abstract method
	Public Overrides Sub DisplayInfo()
		Console.WriteLine("This is a car.")
	End Sub
	Public Overrides Sub StartEngine()
		Console.WriteLine("Car engine started with custom settings.")
	End Sub
End Class
VB   C#

Aquí, la clase Car proporciona implementaciones específicas tanto para el método abstracto DisplayInfo como para el método virtual StartEngine.

Diferencias y cuándo utilizarlas

  • Utilice métodos abstractos cuando todas las clases derivadas deban proporcionar su propia implementación de un método.
  • Utilice métodos virtuales cuando las clases derivadas deban tener la opción de anular un valor predeterminado o proporcionar comportamientos adicionales.

    Los métodos abstractos y virtuales son potentes características de C# que permiten escribir código más fácil de mantener y reutilizable. Al definir todos los métodos de una clase base como abstractos o virtuales, puede dictar qué métodos deben sobrescribirse en las clases derivadas y qué métodos pueden sobrescribirse opcionalmente para modificar o ampliar el comportamiento predeterminado.

Anulación de métodos virtuales

La redefinición de métodos virtuales en clases derivadas permite un comportamiento personalizado mientras se mantiene la opción de llamar a la implementación de la clase base. Para ello se utiliza la palabra clave base.

Ejemplo de sobreescritura y llamada a la implementación base

public class ElectricCar : Car
{
    public override void StartEngine()
    {
        base.StartEngine(); // Call the base class implementation
        Console.WriteLine("Electric car engine started with energy-saving mode.");
    }
}
public class ElectricCar : Car
{
    public override void StartEngine()
    {
        base.StartEngine(); // Call the base class implementation
        Console.WriteLine("Electric car engine started with energy-saving mode.");
    }
}
Public Class ElectricCar
	Inherits Car

	Public Overrides Sub StartEngine()
		MyBase.StartEngine() ' Call the base class implementation
		Console.WriteLine("Electric car engine started with energy-saving mode.")
	End Sub
End Class
VB   C#

En este ejemplo, ElectricCar, que es una clase hija de Car, anula el método StartEngine heredado de su clase padre. Llama a la implementación de la clase base y añade un comportamiento adicional específico para los coches eléctricos.

Implementación de clases abstractas y no abstractas

Es esencial comprender las diferencias y aplicaciones prácticas de las clases abstractas y no abstractas en el desarrollo de software. Las clases abstractas sirven de plantilla para otras clases, mientras que las clases no abstractas se utilizan para instanciar objetos. La elección entre utilizar una clase abstracta o una clase no abstracta depende de si necesita crear una clase base que no deba instanciarse por sí misma.

IronPDF: Biblioteca PDF C

C# Virtual Vs Resumen(Cómo funciona para los desarrolladores): Figura 1 - IronPDF

IronPDF es una completa biblioteca PDF diseñada para generar, editar y leer documentos PDF directamente en aplicaciones .NET. Esta herramienta destaca por su capacidad para crearPDFs directamente desde cadenas HTML, archivos y URLs. Los desarrolladores pueden crear, modificar y extraer contenido PDF mediante programación en proyectos C#. Veamos un ejemplo de IronPDF en el contexto de nuestro artículo.

La principal capacidad de IronPDF es convertirHTML a PDF, asegurando que se mantengan los diseños y estilos. Esta herramienta es genial para crear PDFs a partir de contenido web para informes, facturas y documentación. Admite la conversión de archivos HTML, URL y cadenas HTML a archivos PDF.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
VB   C#

Ejemplo de código

A continuación se muestra un ejemplo de código real para ilustrar el uso de las palabras clave virtual y abstract en el contexto de la ampliación de las funcionalidades de IronPDF:

public abstract class PdfReportGenerator
{
    // Use abstract method to force derived classes to implement their custom PDF generation logic.
    public abstract void GenerateReport(string filePath);
    // A virtual function allows derived classes to override the default implementation of PDF setup.
    public virtual void SetupPdfGenerator()
    {
        // Default PDF setup logic that can be overridden by derived classes.
        IronPdf.Installation.TempFolderPath = @"F:\TempPdfFiles";
    }
}
public class MonthlyReportGenerator : PdfReportGenerator
{
    // Override abstract method to provide specific implementation using override modifier.
    public override void GenerateReport(string filePath)
    {
        var pdf = new ChromePdfRenderer();
        pdf.RenderHtmlAsPdf("<h1>Monthly Report</h1> <p>Add Your report content here....</p>").SaveAs(filePath);
    }
    // Optionally override the virtual method to customize the setup.
    public override void SetupPdfGenerator()
    {
        base.SetupPdfGenerator();
        // Additional setup logic specific to monthly reports.
        IronPdf.Installation.TempFolderPath = @"F:\MonthlyReports";
    }
}
class Program
{
    static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";
        PdfReportGenerator reportGenerator = new MonthlyReportGenerator();
        reportGenerator.SetupPdfGenerator();
        reportGenerator.GenerateReport(@"F:\MonthlyReports\MonthlyReport.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}
public abstract class PdfReportGenerator
{
    // Use abstract method to force derived classes to implement their custom PDF generation logic.
    public abstract void GenerateReport(string filePath);
    // A virtual function allows derived classes to override the default implementation of PDF setup.
    public virtual void SetupPdfGenerator()
    {
        // Default PDF setup logic that can be overridden by derived classes.
        IronPdf.Installation.TempFolderPath = @"F:\TempPdfFiles";
    }
}
public class MonthlyReportGenerator : PdfReportGenerator
{
    // Override abstract method to provide specific implementation using override modifier.
    public override void GenerateReport(string filePath)
    {
        var pdf = new ChromePdfRenderer();
        pdf.RenderHtmlAsPdf("<h1>Monthly Report</h1> <p>Add Your report content here....</p>").SaveAs(filePath);
    }
    // Optionally override the virtual method to customize the setup.
    public override void SetupPdfGenerator()
    {
        base.SetupPdfGenerator();
        // Additional setup logic specific to monthly reports.
        IronPdf.Installation.TempFolderPath = @"F:\MonthlyReports";
    }
}
class Program
{
    static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";
        PdfReportGenerator reportGenerator = new MonthlyReportGenerator();
        reportGenerator.SetupPdfGenerator();
        reportGenerator.GenerateReport(@"F:\MonthlyReports\MonthlyReport.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}
Public MustInherit Class PdfReportGenerator
	' Use abstract method to force derived classes to implement their custom PDF generation logic.
	Public MustOverride Sub GenerateReport(ByVal filePath As String)
	' A virtual function allows derived classes to override the default implementation of PDF setup.
	Public Overridable Sub SetupPdfGenerator()
		' Default PDF setup logic that can be overridden by derived classes.
		IronPdf.Installation.TempFolderPath = "F:\TempPdfFiles"
	End Sub
End Class
Public Class MonthlyReportGenerator
	Inherits PdfReportGenerator

	' Override abstract method to provide specific implementation using override modifier.
	Public Overrides Sub GenerateReport(ByVal filePath As String)
		Dim pdf = New ChromePdfRenderer()
		pdf.RenderHtmlAsPdf("<h1>Monthly Report</h1> <p>Add Your report content here....</p>").SaveAs(filePath)
	End Sub
	' Optionally override the virtual method to customize the setup.
	Public Overrides Sub SetupPdfGenerator()
		MyBase.SetupPdfGenerator()
		' Additional setup logic specific to monthly reports.
		IronPdf.Installation.TempFolderPath = "F:\MonthlyReports"
	End Sub
End Class
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"
		Dim reportGenerator As PdfReportGenerator = New MonthlyReportGenerator()
		reportGenerator.SetupPdfGenerator()
		reportGenerator.GenerateReport("F:\MonthlyReports\MonthlyReport.pdf")
		Console.WriteLine("Report generated successfully.")
	End Sub
End Class
VB   C#

En este ejemplo de implementación personalizada, PdfReportGenerator es una clase abstracta que define un contrato para generar informes PDF con un método para generar el informe y un método virtual para la configuración que se puede sobrescribir opcionalmente. MonthlyReportGenerator es una implementación concreta que proporciona los detalles para generar un informe mensual y personaliza la configuración sobrescribiendo el método virtual.

C# Virtual Vs Resumen(Cómo funciona para los desarrolladores): Figura 2 - Salida del informe

Conclusión

C# Virtual Vs Resumen(Cómo funciona para los desarrolladores): Figura 3 - Licencias

Comprender y utilizar eficazmente los métodos virtuales y abstractos puede mejorar significativamente su programación en C#. Recuerde que los métodos abstractos requieren que una clase derivada proporcione una implementación, mientras que los métodos virtuales permiten una modificación opcional de una implementación predeterminada. La biblioteca IronPDF ofrece unprueba gratuita y opciones de licencia, con licencias a partir de 749 $, proporcionando una solución completa para sus necesidades de PDF.

< ANTERIOR
C# Parcial (Cómo funciona para desarrolladores)
SIGUIENTE >
Cómo generar informes PDF con ASP.NET

¿Listo para empezar? Versión: 2024.12 acaba de salir

Descarga gratuita de NuGet Descargas totales: 11,622,374 Ver licencias >