.NET ヘルプ

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

公開済み 2024年2月18日
共有:

オブジェクト指向プログラミングの世界では、C# 言語は開発者に対して堅牢なソフトウェアを設計および実装するための多用途なツールセットを提供します。 クラス継承に追加の制御層を提供する特徴の一つに、シールドクラスの概念があります。 シールドクラスは、継承階層を制限するユニークな方法を提供し、特定のシナリオで有益なセキュリティとカプセル化のレベルを提供します。 この記事では、C#のシールドクラスの複雑さに深入りし、その詳細を探求します。また、IronPDFNuGetパッケージ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 
{
}
Public NotInheritable Class Animal
	Public Property Species() As String
	Public Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
Public Class Dog ' Error: Cannot be inherited
	Inherits Animal

End Class
VB   C#

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

シールドメソッド(Sealed Method): 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");
    }
}
Public Class Animal
	Public Property Species() As String
	Public Overridable Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
Public Class Dog
	Inherits Animal

	Public NotOverridable Overrides Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
VB   C#

仮想(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 */ }
    }
}
Public NotInheritable Class ControlledClass
	Public NotOverridable Property ControlledProperty() As String
	Public Overridable NotOverridable Sub ControlledMethod()
		' Method implementation
	End Sub
	' Sealed event
	Public Event ControlledEvent As EventHandler
	' Sealed indexers, if applicable
	Default Public NotOverridable Property Item(ByVal index As Integer) As String
		Get
			Return "Value"
		End Get
		Set(ByVal value As String)
		End Set
	End Property
End Class
VB   C#

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

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

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

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

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

  1. シールドクラスは控えめに使用: シールドクラスは利点を提供しますが、慎重に使用する必要があります。 シールドクラスの過剰使用は、硬直的で保守性の低いコードにつながる可能性があります。

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

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

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

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

IronPDFの紹介

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

IronPDFは、からのC# PDFライブラリですIron SoftwareおよびモダンなPDFジェネレーターおよびリーダーです。

インストール

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

dotnet add package IronPdf

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

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

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");
    }
}
Namespace OrderBy
	Public Class Program
		Shared Sub Main()
			Console.WriteLine("Demo Sealed Class and IronPdf")
			Dim dog As New Dog()
			dog.MakeSound()
			dog.Print()
		End Sub
	End Class
	' Sealed base class
	Public Class Animal
		Public Property Species() As String
		Public Overridable Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub
		Public Overridable Sub Print()
			Console.WriteLine("Generic animal Print")
		End Sub
	End Class
	Public Class Dog
		Inherits Animal

		Public NotOverridable Overrides Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub
		Public NotOverridable Overrides Sub Print()
			Dim pdfDocument = New ChromePdfRenderer()
			Dim content As String = $"<!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>"
	ignore ignore ignore ignore ignore ignore ignore ignore pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf")
		End Sub
	End Class
End Namespace
VB   C#

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

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

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

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

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

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'"IronPdf.LicenseKey": "your license key"
VB   C#

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

結論

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

< 以前
C# 優先順位キュー(開発者向けの仕組み)
次へ >
C# LINQ Join クエリ構文(開発者向けの動作方法)