フッターコンテンツにスキップ
.NETヘルプ

C# Vitrual Vs Abstract(開発者向けの動作方法)

C#では、仮想メソッドは派生クラスでオーバーライドでき、抽象メソッドは必ず派生クラスでオーバーライドしなければなりません。 これにより柔軟な挙動が可能になり、オブジェクト指向プログラミングにおいて多態性を実現します。 これら2つの概念は、オブジェクト指向プログラミングにおける柔軟性と再利用性を可能にします。 この記事では、抽象メソッドと仮想メソッドの詳細を説明し、具体的な例を提供し、コーディングにおける実践的な使用法に焦点を当てます。 この記事の後半では、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
$vbLabelText   $csharpLabel

この例では、Vehicleクラスは抽象クラスであり、DisplayInfoは抽象メソッドです。 VehicleクラスにはDisplayInfoメソッドに実装がありません。 これは、派生クラスにこのメソッドの独自の定義を提供することを強制します。

仮想メソッド

仮想メソッドは、基本クラスにデフォルトの実装を持つが、派生クラスでオーバーライドできるメソッドです。 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");
    }
}
' Non-abstract class
Public Class Animal
	' Virtual method with a default implementation
	Public Overridable Sub Speak()
		Console.WriteLine("Some generic animal sound")
	End Sub
End Class
$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.");
    }
}
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
$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.");
    }
}
Public Class Car
	Inherits Vehicle

	' Override the abstract method
	Public Overrides Sub DisplayInfo()
		Console.WriteLine("This is a car.")
	End Sub

	' Override the virtual method
	Public Overrides Sub StartEngine()
		Console.WriteLine("Car engine started with custom settings.")
	End Sub
End Class
$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.");
    }
}
Public Class ElectricCar
	Inherits Car

	' Override the StartEngine method
	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
$vbLabelText   $csharpLabel

この例でElectricCarは、Carの子クラスで、親クラスから継承したStartEngineメソッドをオーバーライドします。 基礎クラスの実装を呼び出し、電気自動車に特有の追加の動作を追加します。

抽象クラスと非抽象クラスの実装

ソフトウェア開発における抽象クラスと非抽象クラスの実際の違いと応用を理解することが重要です。 抽象クラスは他のクラスのためのテンプレートとして機能し、非抽象クラスはオブジェクトをインスタンス化するために使用されます。 抽象クラスを使用するか非抽象クラスを使用するかの選択は、基盤のクラスを作成する必要があるか、単独でインスタンス化されるべきでないかに依存します。

IronPDF: C# PDFライブラリー

C#仮想対抽象(開発者向けの動作方法):図1 - IronPDF

IronPDFは、.NETアプリケーション内で直接PDFドキュメントを生成、編集、および読み取るために設計された包括的な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");
    }
}
Imports IronPdf

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

		' 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")

		' 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")

		' 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
$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.");
    }
}
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
	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
$vbLabelText   $csharpLabel

このカスタム実装の例では、PdfReportGeneratorは、レポートを生成するメソッドと、オプションでオーバーライドできるセットアップのための仮想メソッドを備えた、PDFレポートを生成するための契約を定義する抽象クラスです。 MonthlyReportGeneratorは、月次レポートを生成するための具体的な詳細を提供し、仮想メソッドをオーバーライドしてセットアップをカスタマイズする具体的な実装です。

C#仮想対抽象(開発者向けの動作方法):図2 - レポート出力

結論

C#仮想対抽象(開発者向けの動作方法):図3 - ライセンス

仮想メソッドと抽象メソッドを効果的に理解し使用することは、C#プログラミングを大幅に向上させます。 抽象メソッドは派生クラスに実装を提供することを要求し、仮想メソッドはデフォルトの実装をオプションでオーバーライドすることを可能にします。 IronPDFライブラリーは、無料トライアルとライセンスオプションを提供しており、ライセンスは$799から始まり、PDFニーズの包括的なソリューションを提供します。

よくある質問

C# の仮想メソッドとは?

C# の仮想メソッドは、既定の実装を含みますが、派生クラスによって特定の動作を提供するためにオーバーライドすることができるメソッドであり、コード設計の柔軟性を促進します。

どのようにして C# で IronPDF を使用して HTML を PDF に変換できますか?

IronPDF の RenderHtmlAsPdf メソッドを使用して、HTML 文字列を PDF に変換できます。これにより、HTML コンテンツのレイアウトとスタイルを生成された PDF ドキュメントに維持することができます。

C# における仮想メソッドと抽象メソッドの違いは何ですか?

仮想メソッドには既定の実装があり、派生クラスでオプションでオーバーライドできますが、抽象メソッドには実装がなく、派生クラスで必ずオーバーライドしなければなりません。

IronPDF は .NET アプリケーションでの PDF 生成にどのように役立ちますか?

IronPDF は、.NET アプリケーション内での PDF ドキュメントの生成、編集、読み取りを容易にする強力なライブラリです。HTML コンテンツからの PDF 生成を可能にし、レイアウトが保持されることを保証します。

C# における抽象メソッドとは何ですか?

抽象メソッドは、抽象クラスで実装なしで宣言され、派生クラスで必ず実装されるメソッドであるため、派生クラスにおける特定の動作が保証されます。

C# のクラスには仮想メソッドと抽象メソッドの両方を持つことができますか?

はい、クラスには仮想メソッドと抽象メソッドの両方を含めることができます。仮想メソッドは既定の実装を提供しますが、抽象メソッドは派生クラスで明示的な実装が必要です。

派生クラスで仮想メソッドをオーバーライドするにはどうすればよいですか?

派生クラスで仮想メソッドをオーバーライドするには、override キーワードを使用し、そのメソッドのシグネチャに従って新しいまたは拡張された実装を行います。

開発者は C# で仮想メソッドをいつ使用すべきですか?

開発者は、既定の動作が必要であり、派生クラスによってオプションでオーバーライドされるときに仮想メソッドを使用すべきです。これにより、ポリモーフィズムとコードの再利用性が促進されます。

C#プロジェクトでIronPDFを使用する利点は何ですか?

IronPDF は、HTML を PDF に変換し、ドキュメントのデザインの整合性を維持するなど、堅牢な PDF 生成および操作機能を提供することにより、C# プロジェクトを強化します。

IronPDF は PDF ドキュメントのレイアウトをどのようにして維持していますか?

IronPDFはHTML文字列、ファイル、またはURLをPDF形式に正確にレンダリングすることにより、HTMLコンテンツをPDFに変換し、すべてのスタイルとレイアウトが出力に保持されることを保証します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。