.NET ヘルプ

C# 仮想と抽象(開発者向けの使い方)

更新済み 4月 29, 2024
共有:

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
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は、デフォルトでエンジンを起動する方法を提供しますが、必要に応じて継承クラスによってオーバーライドすることができます。

派生クラスの例

さて、次にVehicleから継承し、抽象メソッドを実装し、必要に応じて仮想メソッドをオーバーライドする、非抽象の子クラスであるCarクラスを定義しましょう:

public class Car : Vehicle
{
// public override void abstractmethod
    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 abstractmethod
    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 abstractmethod
	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#

この例では、Carの派生クラスであるElectricCarが、親クラスから継承されたStartEngineメソッドをオーバーライドしています。 ベースクラスの実装を呼び出し、電気自動車特有の追加動作を加えます。

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

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

IronPDF: C# PDFライブラリ

C# バーチャル vs 抽象(開発者のための仕組み):図1 - IronPDF

IronPDFは、.NETアプリケーション内で直接PDFドキュメントを生成、編集、および読み取るために設計された包括的なPDFライブラリです。 このツールは、作成機能で際立っています。

HTML文字列から直接PDFを作成、HTMLファイル、およびURL。 開発者はC#プロジェクトでプログラム的にPDFコンテンツを作成、修正、および抽出することができます。 記事の文脈でIronPDFの例を見てみましょう。

コード例

以下は、IronPDFの機能を拡張する際にvirtualおよびabstractキーワードを使用する実際のコード例です:

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# バーチャルと抽象(開発者向けのメカニズムの解説):図2 - レポート出力

結論

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

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

< 以前
C# 部分クラス(開発者向けの仕組み)
次へ >
ASP.NETを使用してPDFレポートを生成する方法

準備はできましたか? バージョン: 2024.9 新発売

無料のNuGetダウンロード 総ダウンロード数: 10,659,073 View Licenses >