跳至頁尾內容
.NET 幫助

C# 虛擬與抽象(開發者如何理解它們)

在 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();
}
$vbLabelText   $csharpLabel

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

虛擬方法

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

// Non-abstract class
public class Animal
{
    // Virtual method with a default implementation
    public virtual void Speak()
    {
        Console.WriteLine("Some generic animal sound");
    }
}
// Non-abstract class
public class Animal
{
    // Virtual method with a default implementation
    public virtual void Speak()
    {
        Console.WriteLine("Some generic animal sound");
    }
}
$vbLabelText   $csharpLabel

在這裡,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.");
    }
}
$vbLabelText   $csharpLabel

在這個 Vehicle 類別中,DisplayInfo 是一個抽象方法,強迫所有派生的類別實作其顯示資訊的方式。 StartEngine則提供了啟動引擎的預設方式,若有需要,可透過繼承類別覆寫。

派生類範例

現在,讓我們定義 Car 類,這是一個非抽象的子類,繼承自 Vehicle 並實作抽象方法,同時可選擇覆寫虛擬方法:

public class Car : Vehicle
{
    // Override the abstract method
    public override void DisplayInfo()
    {
        Console.WriteLine("This is a car.");
    }

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

    // Override the virtual method
    public override void StartEngine()
    {
        Console.WriteLine("Car engine started with custom settings.");
    }
}
$vbLabelText   $csharpLabel

在此,Car 類提供抽象方法 DisplayInfo 和虛擬方法 StartEngine 的特定實作。

差異與使用時機

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

抽象方法和虛擬方法是 C# 的強大功能,可讓您寫出更具維護性和可重用性的程式碼。 透過將基底類別中的方法定義為抽象或虛擬,您可以規定哪些方法必須在派生類別中覆蓋,以及哪些方法可以選擇性地覆蓋以修改或擴充預設行為。

覆寫虛擬方法

在派生類中覆寫虛擬方法允許自訂行為,同時保留呼叫基類實作的選項。 這可以使用 base 關鍵字來達成。

重覆和呼叫基本實作的範例

public class ElectricCar : Car
{
    // Override the StartEngine method
    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
{
    // Override the StartEngine method
    public override void StartEngine()
    {
        base.StartEngine(); // Call the base class implementation
        Console.WriteLine("Electric car engine started with energy-saving mode.");
    }
}
$vbLabelText   $csharpLabel

在這個範例中,ElectricCarCar 的子類,它覆寫了從父類繼承的 StartEngine 方法。 它呼叫基類實作,並新增電動車特有的行為。

實作抽象與非抽象類別

了解軟體開發中抽象與非抽象類的實際差異與應用是非常重要的。 抽象類用作其他類別的範本,而非抽象類則用來實體化物件。 在使用抽象類和非抽象類之間的選擇取決於您是否需要建立一個不應該單獨實體化的基類。

IronPDF:C# PDF 函式庫

C# Virtual Vs Abstract (How It Works For Developers):圖 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();

        // 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");

        // 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");

        // 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();

        // 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");

        // 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");

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

程式碼範例

以下是一個簡單直接的實際程式碼範例,以說明 virtualabstract 關鍵字在擴充 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
    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
    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.");
    }
}
$vbLabelText   $csharpLabel

在這個自訂實作範例中,PdfReportGenerator 是一個抽象類別,定義了一個用於產生 PDF 報告的契約,其中包含一個產生報告的方法和一個用於設定的虛擬方法,該虛擬方法可以選擇性地覆寫。 MonthlyReportGenerator 是一個具體的實作,它提供了產生月報表的具體細節,並透過覆寫虛擬方法來自訂設定。

C# Virtual Vs Abstract (How It Works For Developers):圖 2 - 報告輸出

結論

C# Virtual Vs Abstract (How It Works For Developers):圖 3 - 授權

了解並有效使用虛擬方法和抽象方法可以大幅提升您的 C# 程式設計能力。 請記住,抽象方法需要派生類提供實作,而虛擬方法則允許可選地覆寫預設實作。 IronPDF 函式庫提供 免費試用和授權選項,授權費用從 $799 起,為您的 PDF 需求提供全面的解決方案。

常見問題解答

C# 中的虛方法是什麼?

C# 中的虛擬方法是包含預設實作的方法,但可以由衍生類別重寫以提供特定行為,從而提高程式碼設計的靈活性。

如何使用 IronPDF 在 C# 中將 HTML 轉換為 PDF?

您可以使用 IronPDF 的RenderHtmlAsPdf方法將 HTML 字串轉換為 PDF。這樣,您就可以在產生的 PDF 文件中保留 HTML 內容的佈局和樣式。

C# 中的虛方法和抽象方法有什麼不同?

虛方法有預設實現,可以在衍生類別中進行選擇性重寫,而抽象方法沒有實現,必須在衍生類別中進行重寫。

IronPDF 如何幫助 .NET 應用程式產生 PDF 檔案?

IronPDF 是一個功能強大的程式庫,可簡化 .NET 應用程式中 PDF 文件的產生、編輯和讀取。它允許從 HTML 內容建立 PDF,並確保佈局得以保留。

C# 中的抽象方法是什麼?

抽象方法是指在抽象類別中宣告但沒有實作的方法,任何非抽象的衍生類別都必須實作該方法,以確保衍生類別具有特定的行為。

C# 中的類別可以同時擁有虛擬方法和抽象方法嗎?

是的,一個類別可以同時包含虛擬方法和抽象方法。虛方法提供預設實現,而抽象方法需要在衍生類別中明確實作。

如何在衍生類別中重寫虛方法?

要在衍生類別中重寫虛擬方法,可以使用override關鍵字,後面跟著方法的簽名,從而實現新的或擴展的方法。

在 C# 中,開發人員何時應該使用虛方法?

當需要一種預設行為,而這種預設行為可以被衍生類別選擇性地覆寫時,開發人員應該使用虛擬方法,從而促進多態性和程式碼重用性。

在 C# 專案中使用 IronPDF 有哪些好處?

IronPDF 透過提供強大的 PDF 生成和操作功能來增強 C# 項目,例如將 HTML 轉換為 PDF 並保持文件的設計完整性。

IronPDF 如何確保 PDF 文件佈局得以保留?

IronPDF 將 HTML 字串、文件或 URL 精確地渲染為 PDF 格式,將 HTML 內容轉換為 PDF,確保所有樣式和佈局在輸出中都得以保留。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。