.NET 幫助

C# 虛擬和抽象(如何為開發者工作)

發佈 2024年4月29日
分享:

在 C# 中,虛擬方法可以在衍生類別中覆寫,而抽象方法必須在衍生類別中覆寫。 這允許靈活的行為並在物件導向程式設計中實現多型。 這兩個概念允許物件導向程式設計中的靈活性和重複使用性。 本文說明了抽象方法和虛擬方法的具體內容,並提供清晰的例子,重點介紹它們在編碼中的實際應用。 我們還將探索IronPDF 的功能和使用案例稍後在本文中。

抽象類別和方法

抽象類是一種特殊類型的類,無法直接實例化。 相反,它作為其他類別的藍圖。 抽象類別可以包含抽象方法,這些方法在抽象類別中宣告,但必須在具體派生類別中實現。

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#

在此範例中,Vehicle 類別是抽象的,而 DisplayInfo 是抽象方法。 DisplayInfo 方法在 Vehicle 類別中沒有任何實作。 它強制派生類別提供此方法的定義。

虛擬方法

虛擬方法是基類中的方法,具有預設實現但可以在派生類中被重寫。 virtual 關鍵字用於將方法宣告為虛擬方法。 衍生類別使用 override 關鍵字來提供方法的特定實現,這有助於理解子類別如何覆寫其父類別的虛方法。

// 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#

這裡,Animal 類別有一個虛擬方法 Speak,並且有一個預設的實作。 派生類別可以使用 override 關鍵字覆寫該方法,以提供特定的動物聲音。

結合虛擬方法和抽象方法

一個類別可以同時擁有抽象方法和虛擬方法。 抽象方法沒有實現,必須在衍生類別中重寫,而虛擬方法則具有預設實現,衍生類別可以選擇性地重寫。

考慮一個情況,您正在建立一個系統來建模不同類型的車輛,每種車輛都有其顯示信息的方式。 以下是使用抽象和虛擬方法的方法:

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#

在這個 Vehicle 類別中,DisplayInfo 是一個抽象方法,強制所有衍生類別實作自己的資訊顯示方式。 然而,StartEngine 提供了一種啟動引擎的預設方式,必要時可由繼承類別覆寫。

派生類別範例

現在,讓我們定義一個 Car 類別,一個從 Vehicle 繼承並實現抽象方法的非抽象子類,同時可選地重寫虛方法:

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#

在這裡,Car 類別為抽象方法 DisplayInfo 和虛擬方法 StartEngine 提供了具體實作。

差異與使用時機

  • 當所有衍生類別都必須提供自己的方法實作時,使用抽象方法。
  • 當衍生類別應具有選擇權以覆蓋預設或提供額外行為時,請使用虛擬方法。

    抽象方法和虛擬方法是 C# 中的強大功能,使您能夠編寫更具可維護性和重用性的代碼。 透過將基類中的所有方法定義為抽象或虛擬的,您可以指定哪些方法在衍生類中必須被覆寫,以及哪些方法可以選擇性地被覆寫以修改或擴展預設行為。

重寫虛擬方法

在衍生類別中覆寫虛擬方法可以自訂行為,同時保留調用基類實現的選項。 這是使用 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#

在這個例子中,ElectricCar 作為 Car 的子類,覆蓋了從其父類繼承的 StartEngine 方法。 它調用基類實現並添加特定於電動汽車的額外行為。

實作抽象類別和非抽象類別

在軟體開發中,理解抽象類別和非抽象類別的實際差異及應用是至關重要的。 抽象類別作為其他類別的模板,而非抽象類別用於實例化對象。 選擇使用抽象類別或非抽象類別取決於您是否需要創建一個不應該自行實例化的基類。

IronPDF:C# PDF 庫

C# 虛擬與抽象(對開發人員的運作方式):圖 1 - IronPDF

IronPDF 是一個全面的 PDF 庫,專為在 .NET 應用程式中直接生成、編輯和閱讀 PDF 文件而設計。 這個工具因其創建能力而顯得突出直接從 HTML 字串、檔案和 URL 生成PDF文件. 開發人員可以在 C# 專案中程式化地創建、修改和提取 PDF 內容。 讓我們在本文的背景下探索 IronPDF 的一個例子。

IronPDF的主要功能是轉換HTML轉PDF確保保留版面配置和樣式。 這個工具非常適合從網頁內容創建報告、發票和文檔的PDF。 它支援將 HTML 檔案、URL 和 HTML 字串轉換為 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#

範例程式碼

以下是一個簡單的實際代碼範例,說明在擴展IronPDF功能時使用virtualabstract關鍵字的情況:

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#

在此自定義實現範例中,PdfReportGenerator 是一個抽象類別,定義了一個使用生成報告的方法來生成 PDF 報告的合約,並具有一個可以選擇性覆蓋的虛擬方法進行設置。 MonthlyReportGenerator 是一個具體的實現類別,提供生成月度報告的細節,並通過重寫虛擬方法來自訂設定。

C# Virtual 與 Abstract(開發人員如何使用): 圖2 - 報告輸出

結論

C# 虛擬與抽象(開發人員運作方式):圖 3 - 授權

理解並有效使用虛擬方法和抽象方法可以顯著提升你的 C# 程式設計能力。 請記住,抽象方法需要衍生類提供實現,而虛擬方法允許可選的覆蓋默認實現。 IronPDF 庫提供一個免費試用和授權選項,許可證起價為 $749,提供您 PDF 需求的綜合解決方案。

< 上一頁
C# 部分 (開發人員如何使用)
下一個 >
如何使用ASP.NET生成PDF報告

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >