.NET ヘルプ

C# の Virtual キーワード(開発者向けの仕組み)

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

C#では、 仮想キーワード オブジェクト指向プログラミングにおいて重要な概念であり、ポリモーフィズムを可能にし、開発者が派生クラスでメソッドをオーバーライドすることを促します。 このキーワードをクラスメソッド、プロパティ、またはイベントに適用すると、そのエンティティが派生クラスによってoverrideキーワードを使用してその動作を変更できることを示します。 このチュートリアルでは、C#の「virtual」キーワードについて学びます。 IronPDFライブラリ。 それでは、実際の例を使ってその動作を確認していきましょう。

アクションでの仮想メソッド

仮想キーワードの基本的な使用法

基本的に、仮想メソッドとは、基本クラスで既に定義されているメソッドに対して、派生クラスが特定の実装を提供できるようにする基本クラスのメソッドです。

C#のvirtualキーワードは、メソッド、プロパティ、またはイベントを仮想としてマークし、それが継承するクラスでオーバーライドできることを示します。 次の例を考えてみましょう。ここでは、仮想メソッドAreaを持つ基底クラスShapeを定義します:

public class Shape
{
    public virtual double Area()
    {
        return 0; // Default implementation, returns 0
    }
}
public class Shape
{
    public virtual double Area()
    {
        return 0; // Default implementation, returns 0
    }
}
Public Class Shape
	Public Overridable Function Area() As Double
		Return 0 ' Default implementation, returns 0
	End Function
End Class
VB   C#

仮想メソッドのオーバーライド

派生クラスはこれらの仮想メソッドをオーバーライドして、派生クラスの特定の要件に合わせた独自の実装を提供できます。 オーバーライドキーワードを使用して、Shape から派生し、独自の Area メソッドを提供する Circle クラスを作成しましょう。

public class Circle : Shape
{
    public double Radius { get; set; }
    public Circle(double radius)
    {
        Radius = radius;
    }
    public override double Area()
    {
        return Math.PI * Radius * Radius; // Own implementation for circle area
    }
}
public class Circle : Shape
{
    public double Radius { get; set; }
    public Circle(double radius)
    {
        Radius = radius;
    }
    public override double Area()
    {
        return Math.PI * Radius * Radius; // Own implementation for circle area
    }
}
Public Class Circle
	Inherits Shape

	Public Property Radius() As Double
	Public Sub New(ByVal radius As Double)
		Me.Radius = radius
	End Sub
	Public Overrides Function Area() As Double
		Return Math.PI * Radius * Radius ' Own implementation for circle area
	End Function
End Class
VB   C#

上述のコード内で、Circle クラスはArea メソッドの特定の実装を提供し、円の面積を計算します。 これは多態性における仮想メソッドの力を示しています。

非仮想メソッド

すべてのメソッドが仮想メソッドである必要はなく、そうすべきでもないことに注意することが重要です。 非仮想メソッドは派生クラスでオーバーライドできないように定義されているため、元の実装が変更されることなく、その実装は継承するすべてのクラスで使用されます。 これは、ベースクラスが変更されるべきではない標準的な実装を提供する場合に役立ちます。

実践的なアプリケーション

これらの概念を実際のシナリオで活用してみましょう。 次のプログラムでは、ShapeクラスとCircleクラスを使用しています:

public class Program
{
    public static void Main(string [] args)
    {
        Shape myShape = new Shape();
        Shape myCircle = new Circle(5);
        Console.WriteLine($"Shape area: {myShape.Area()}");
        Console.WriteLine($"Circle area: {myCircle.Area()}");
    }
}
public class Program
{
    public static void Main(string [] args)
    {
        Shape myShape = new Shape();
        Shape myCircle = new Circle(5);
        Console.WriteLine($"Shape area: {myShape.Area()}");
        Console.WriteLine($"Circle area: {myCircle.Area()}");
    }
}
Public Class Program
	Public Shared Sub Main(ByVal args() As String)
		Dim myShape As New Shape()
		Dim myCircle As Shape = New Circle(5)
		Console.WriteLine($"Shape area: {myShape.Area()}")
		Console.WriteLine($"Circle area: {myCircle.Area()}")
	End Sub
End Class
VB   C#

上記の例題プログラムは、多様性と仮想関数の本質を実演しています。 myCircleShape として宣言されているにもかかわらず、オーバーライドされた Circle クラスの Area メソッドを呼び出しています。これは、virtual キーワードと override キーワードによる動的ディスパッチメカニズムを示しています。

C# の virtual キーワード(開発者向けの仕組み):図1 - 上記のコードからのコンソール出力は、myCircle がオーバーライドされた Area メソッドを呼び出す様子を示しています。

仮想およびオーバーライドキーワードの高度な使用法

抽象メソッドとクラス

抽象メソッドは、さらに一歩進んだもので、抽象クラスで使用されます。 抽象メソッドとは、基底クラスで宣言され、実装がないメソッドで、派生クラスでオーバーライドする必要があります。 これは、派生クラスに抽象メソッドの実装を提供することを強制し、一貫したインターフェースを確保しながら、各派生クラスでカスタマイズされた動作を可能にします。

メソッドのオーバーロード vs. オーバーライド

メソッドのオーバーロードとメソッドのオーバーライドの違いを理解することも重要です。 メソッドのオーバーロードは同じクラス内で発生し、異なるパラメーターを持つ複数のメソッドが同じ名前を持つことを可能にします。 仮想およびオーバーライドキーワードによって可能になるメソッドのオーバーライドは、派生クラスが基底クラスで定義されたメソッドに対して異なる実装を提供することを可能にします。

仮想プロパティおよびイベント

方法の他に、プロパティやイベントも仮想化することができます。 これは派生クラスがカスタムゲッター、セッター、およびイベントハンドラーを提供できるようにし、クラス階層の柔軟性をさらに向上させます。

IronPDF: .NET PDFライブラリ

IronPDF は、.NETアプリケーション内でPDFドキュメントを生成、操作、およびレンダリングするためにC#開発者向けに設計された包括的なライブラリです。 直感的なAPIを提供し、簡素化します PDFファイルの取り扱い開発者が複雑なPDFドキュメント構造を理解したり、外部ソフトウェアを使用したりすることなく、PDFの作成、編集、および変換を行うのを支援します。 IronPDFは、仮想キーワードの使用を含む言語のオブジェクト指向機能とシームレスに統合し、カスタマイズ可能なPDF処理機能を提供します。

IronPDFでvirtualキーワードを使用することにより、開発者は自分のアプリケーション内でIronPDFのクラスの機能を拡張することができます。 PDFの生成や操作に関する仮想メソッドを備えた基底クラスを定義することにより、開発者はこれらのメソッドをオーバーライドして、特定のニーズに合わせたPDF処理の動作をカスタマイズできる派生クラスを作成できます。

例: 仮想メソッドによるPDFレンダリングのカスタマイズ

HTML文字列からPDFをレンダリングするためにIronPDFを使用する基底クラスを想像してください。 レンダリング方法を仮想としてマークすることで、派生クラスがレンダリングプロセスを修正または強化することができます。 以下は簡単な例です:

public class BasicPdfRenderer
{
    // Virtual method allowing customization in derived classes
    public virtual byte [] RenderHtmlToPdf(string htmlContent)
    {
        // Use IronPDF to render PDF from HTML
        var renderer = new IronPdf.ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
        return pdfDocument.BinaryData;
    }
}
public class CustomPdfRenderer : BasicPdfRenderer
{
    // Overriding the base class method to implement custom rendering settings
    public override byte [] RenderHtmlToPdf(string htmlContent)
    {
        var renderer = new IronPdf.ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
        // Apply a prominent watermark to the PDF document
        pdfDocument.ApplyWatermark("<h2 style='color:red; font-size: 60px; opacity: 0.5; text-shadow: 2px 2px 5px grey;'>SAMPLE</h2>",
                                      30,
                                      IronPdf.Editing.VerticalAlignment.Middle,
                                      IronPdf.Editing.HorizontalAlignment.Center);
        // Return the binary data of the PDF document
        return pdfDocument.BinaryData;
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        // HTML content to be converted to PDF
        string htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a simple PDF document generated from HTML.</p>";
        // Create an instance of CustomPdfRenderer
        CustomPdfRenderer renderer = new CustomPdfRenderer();
        // Call RenderHtmlToPdf method to generate PDF binary data
        byte [] pdfData = renderer.RenderHtmlToPdf(htmlContent);
        // Specify the file path to save the PDF
        string filePath = "f:\\CustomRenderedPdf.pdf";
        // Save the binary data to a file
        File.WriteAllBytes(filePath, pdfData);
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
public class BasicPdfRenderer
{
    // Virtual method allowing customization in derived classes
    public virtual byte [] RenderHtmlToPdf(string htmlContent)
    {
        // Use IronPDF to render PDF from HTML
        var renderer = new IronPdf.ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
        return pdfDocument.BinaryData;
    }
}
public class CustomPdfRenderer : BasicPdfRenderer
{
    // Overriding the base class method to implement custom rendering settings
    public override byte [] RenderHtmlToPdf(string htmlContent)
    {
        var renderer = new IronPdf.ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
        // Apply a prominent watermark to the PDF document
        pdfDocument.ApplyWatermark("<h2 style='color:red; font-size: 60px; opacity: 0.5; text-shadow: 2px 2px 5px grey;'>SAMPLE</h2>",
                                      30,
                                      IronPdf.Editing.VerticalAlignment.Middle,
                                      IronPdf.Editing.HorizontalAlignment.Center);
        // Return the binary data of the PDF document
        return pdfDocument.BinaryData;
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        // HTML content to be converted to PDF
        string htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a simple PDF document generated from HTML.</p>";
        // Create an instance of CustomPdfRenderer
        CustomPdfRenderer renderer = new CustomPdfRenderer();
        // Call RenderHtmlToPdf method to generate PDF binary data
        byte [] pdfData = renderer.RenderHtmlToPdf(htmlContent);
        // Specify the file path to save the PDF
        string filePath = "f:\\CustomRenderedPdf.pdf";
        // Save the binary data to a file
        File.WriteAllBytes(filePath, pdfData);
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
Public Class BasicPdfRenderer
	' Virtual method allowing customization in derived classes
	Public Overridable Function RenderHtmlToPdf(ByVal htmlContent As String) As Byte()
		' Use IronPDF to render PDF from HTML
		Dim renderer = New IronPdf.ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
		Return pdfDocument.BinaryData
	End Function
End Class
Public Class CustomPdfRenderer
	Inherits BasicPdfRenderer

	' Overriding the base class method to implement custom rendering settings
	Public Overrides Function RenderHtmlToPdf(ByVal htmlContent As String) As Byte()
		Dim renderer = New IronPdf.ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
		' Apply a prominent watermark to the PDF document
		pdfDocument.ApplyWatermark("<h2 style='color:red; font-size: 60px; opacity: 0.5; text-shadow: 2px 2px 5px grey;'>SAMPLE</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center)
		' Return the binary data of the PDF document
		Return pdfDocument.BinaryData
	End Function
End Class
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"
		' HTML content to be converted to PDF
		Dim htmlContent As String = "<h1>Hello, IronPDF!</h1><p>This is a simple PDF document generated from HTML.</p>"
		' Create an instance of CustomPdfRenderer
		Dim renderer As New CustomPdfRenderer()
		' Call RenderHtmlToPdf method to generate PDF binary data
		Dim pdfData() As Byte = renderer.RenderHtmlToPdf(htmlContent)
		' Specify the file path to save the PDF
		Dim filePath As String = "f:\CustomRenderedPdf.pdf"
		' Save the binary data to a file
		File.WriteAllBytes(filePath, pdfData)
		Console.WriteLine($"PDF generated and saved to {filePath}")
	End Sub
End Class
VB   C#

私たちは、HTMLをPDFに変換するために BasicPdfRenderer クラス内でIronPDFを利用し、その RenderHtmlToPdf メソッドをカスタマイズ可能にするために virtual としてマークします。 以下の内容を日本語に翻訳してください:

CustomPdfRenderer クラスは BasicPdfRenderer から派生しており、このメソッドをオーバーライドして、変換を実行するだけでなく、特有の大きな赤い 生成されたPDFにウォーターマークを追加.

PDFファイル出力

これはIronPDFによって生成されたPDFファイルです。

C#仮想キーワード(開発者にとっての動作方法):図2 - 変換のためにCustomPdfRenderedから仮想メソッドRenderHtmlToPDFを使用している例コードの出力

結論

C# 仮想キーワード (開発者向けの仕組み): 図3 - IronPDF ライセンスページ

C# の virtual キーワードは、オブジェクト指向プログラミングの基盤となり、多態性と動的ディスパッチを可能にします。 基底クラスで定義されたメソッド、プロパティ、およびイベントに特定の実装を提供できるようにすることにより、派生クラスは開発者に柔軟で再利用可能なコード構造を作成する力を与えます。 実践的な例と仮想メソッド、オーバーライド機構、クラス階層の関係を理解することで、開発者はこれらの概念を効果的に活用し、堅牢なアプリケーションを構築できます。 さらに、これらの概念は、開発者がアプリケーションでIronPDFをより効率的に使用するのにも役立ちます。 IronPDFを無料でテストすることができます。他に費用はかかりません。 無料試用 $749からの費用がかかります。

< 以前
C# ジェネリクス(開発者向けの仕組み)
次へ >
ネイティブUI C#(開発者向けの動作方法)

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

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