.NET ヘルプ

C# 密封クラス(開発者向けの仕組み)

チペゴ
チペゴ・カリンダ
2024年2月18日
共有:

オブジェクト指向プログラミングの世界では、C# 言語は開発者に対して堅牢なソフトウェアを設計および実装するための多用途なツールセットを提供します。 クラス継承に追加の制御層を提供する特徴の一つに、シールドクラスの概念があります。 シールドクラスは、継承階層を制限するユニークな方法を提供し、特定のシナリオで有益なセキュリティとカプセル化のレベルを提供します。 この記事では、C# の sealed クラスの複雑さを掘り下げ、IronPDF NuGet パッケージをIron Softwareから探索します。

シールドクラスとシールドメソッドとは何ですか?

シールドクラス: C#では、シールドクラスは継承できないクラスです。 sealedキーワードを使用することで、開発者は他のクラスがsealedクラスから派生したり拡張したりするのを防ぐことができます。 この意図的な制限により、sealed クラスが他のクラスの基底クラスとして使用されることがなくなり、継承階層の範囲が制限されます。 シールドクラスは、クラスの構造を制御し、継承による意図しない変更を防ぐために、開発者がしばしば使用します。

以下の例を考えてみてください:

public sealed class Animal
{
    public string Species { get; set; }
    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal // Error: Cannot be inherited 
{
}
public sealed class Animal
{
    public string Species { get; set; }
    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal // Error: Cannot be inherited 
{
}

構造体とは異なり、暗黙的に封じられるものですが、封印されたクラスは上記のようにsealedキーワードを使用して宣言する必要があります。 この例では、Animal クラスは sealed として宣言されているため、他のクラスがこのクラスを継承することはできません。

シールドメソッド: C# はクラス全体をシールすることに加えて、クラス内の個々のメソッドをシールすることも可能です。 シールドメソッドとは、派生クラスがオーバーライドできないメソッドのことです。これにより、メソッドの動作がすべてのサブクラスで一貫して維持され、アプリケーションのロジックに予測可能性を提供します。

メソッドを封じるためには、sealed修飾子を使用します:

public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

仮想(virtual)キーワードは、派生クラスでメソッドをオーバーライドできるようにします。一方、封印(sealed)キーワードは、基底クラスの仮想メソッドをそれ以降のサブクラスでさらにオーバーライドできないようにします。

シールドクラスとクラスメンバー: シールドクラスには、プロパティ、メソッド、イベントなどのシールドメンバーを含めることもできます。 シールドクラスとそのメンバーの組み合わせにより、クラスの動作と構造に対して高い制御が確保されます。

以下の例を考えてみてください:

public sealed class ControlledClass
{
    public sealed string ControlledProperty { get; set; }
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
    }
    // Sealed event
    public sealed event EventHandler ControlledEvent;
    // Sealed indexers, if applicable
    public sealed string this [int index]
    {
        get { return "Value"; }
        set { /* Setter implementation */ }
    }
}
public sealed class ControlledClass
{
    public sealed string ControlledProperty { get; set; }
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
    }
    // Sealed event
    public sealed event EventHandler ControlledEvent;
    // Sealed indexers, if applicable
    public sealed string this [int index]
    {
        get { return "Value"; }
        set { /* Setter implementation */ }
    }
}

この例では、ControlledClass のすべての側面がシールされています - プロパティ、メソッド、イベント、および適用可能なインデクサーさえも。 このレベルのシーリングは、堅牢で変更不可能な構造を提供し、クラスの設計が固定されているべきシナリオに理想的です。

シールドクラスの背後にある論理

コードセキュリティ:シールドクラスは、認可されていないアクセスや修正を防ぐことでコードセキュリティに貢献します。 クラスがシールドされると、それは明確なインターフェースと振る舞いを持つ閉じたエンティティとして機能します。 このカプセル化により、誤って副作用や変更が発生し、コードベースの安定性やセキュリティが損なわれるリスクを最小限に抑えることができます。

設計の整合性: 大規模なコードベースやフレームワークでは、設計の整合性を維持することが最も重要です。 シールドクラスは、固定された構造を持つ基礎的なビルディングブロックとして機能し、意図しない変更の可能性を減らします。 これは、クラスがシステムの中核コンポーネントとして機能し、その動作が異なるモジュール間で一貫しているべきシナリオにおいて特に有益です。

シールドクラス使用のベストプラクティス

  1. シールドクラスは慎重に使用してください: シールドクラスには利点がありますが、慎重に使用するべきです。 シールドクラスの過剰使用は、硬直的で保守性の低いコードにつながる可能性があります。

  2. ドキュメントの意図:クラスまたはメソッドをシールする際には、その決定の背後にある意図を文書化することが重要です。 特定のクラスがsealedとして定義されている理由と、その選択に至った設計上の考慮事項を説明してください。

  3. 将来の拡張性を考慮する: クラスをシールする前に、将来の要件が拡張性を必要とするかもしれないことを考慮してください。 クラスが将来的に拡張される可能性がある場合、そのクラスをシールすることは今後の開発を妨げるかもしれません。

  4. 安定性のためにシールドメソッドを使用する: メソッドのコアの動作が異なるサブクラス間で安定しているべき場合、シールドメソッドが有益です。 これにより、コードの予測可能性が向上します。

  5. また、抽象であることはできません: シールドクラス/シールドメソッドは、抽象クラス/抽象メソッドでもあることはできません。抽象クラスは他のクラスによって継承されるように設計されていますが、シールドクラスは継承を制限します。

IronPDFの紹介

C# シールドクラス(開発者向けの動作方法):図 1 - IronPDF ウェブページ

IronPDFIron Software の C# PDF ライブラリであり、最新の PDF ジェネレーターおよびリーダーです。

インストール

IronPDFは、NuGet パッケージマネージャーコンソールまたはVisual Studioパッケージマネージャーを使用してインストールできます。 以下はコンソールのコマンドです:

dotnet add package IronPdf

または、NuGet パッケージ マネージャーを使用して IronPDF をインストールするには、NuGet パッケージ マネージャーの検索バーに「ironpdf」と入力して検索してください。

C# シールドクラス(開発者のための仕組み): 図 2 - NuGet パッケージマネージャーを介してIronPDFライブラリをインストールする

IronPDFとシールドクラス

sealed キーワードとIronPDFを一緒に使用することで、サブクラスライブラリや派生ライブラリが継承されたメンバーをオーバーライドするのを防ぎ、PDFを生成することができます。

namespace OrderBy;
public class Program
{
    static void Main()
    {
        Console.WriteLine("Demo Sealed Class and IronPdf");
        var dog = new Dog();
        dog.MakeSound();
        dog.Print();
    }
}
// Sealed base class
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public virtual void Print()
    {
        Console.WriteLine("Generic animal Print");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public sealed override void Print()
    {
        var pdfDocument = new ChromePdfRenderer();
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>";
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
    }
}
namespace OrderBy;
public class Program
{
    static void Main()
    {
        Console.WriteLine("Demo Sealed Class and IronPdf");
        var dog = new Dog();
        dog.MakeSound();
        dog.Print();
    }
}
// Sealed base class
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public virtual void Print()
    {
        Console.WriteLine("Generic animal Print");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public sealed override void Print()
    {
        var pdfDocument = new ChromePdfRenderer();
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>";
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
    }
}

C# シールドクラス(開発者向けの動作方法):図 3 - コンソール出力、実行コマンドとそれに続くコンソールメッセージを示しています

以下は IronPDF から生成された PDF です。

C# シールドクラス(開発者向けの仕組み):図 4 - 前述のコード例で生成された出力 PDF

ライセンス(無料トライアル利用可能)

IronPDF。 このキーはappsettings.jsonに配置する必要があります。

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"

試用ライセンスを取得するためにメールアドレスを提供してください。

結論

C#のsealedクラスは、開発者に継承の階層を制御し、特定のクラスおよびそのメンバーが拡張されたりオーバーライドされたりしないようにするための強力なメカニズムを提供します。 シールドクラスの使用は慎重に検討すべきですが、機能をカプセル化し、意図しない修正を防ぐための効果的な手段を提供します。 シールドクラスとメソッドの概念を理解することで、開発者はこの制約をいつどこで適用するかについて情報に基づいた決定を下すことができ、それによって保守性が高く、安全で予測可能なソフトウェアシステムを作成することに貢献します。 IronPDFと一緒に、PDFドキュメントを印刷することもできます。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# 優先順位キュー(開発者向けの仕組み)
次へ >
C# LINQ Join クエリ構文(開発者向けの動作方法)