カテゴリ: C# 更新日: 2025/11/23

C#のsealedクラス・sealedメソッドとは?継承制限の方法を解説

C#のsealedクラス・sealedメソッドとは?継承制限の方法を解説
C#のsealedクラス・sealedメソッドとは?継承制限の方法を解説

先生と生徒の会話形式で理解しよう

生徒

「クラスやメソッドって、ほかのところから自由に使えるんですか?」

先生

「C#では、基本的にクラスやメソッドは継承して使うことができます。でも、継承させたくないときには制限をかける方法がありますよ。」

生徒

「継承を制限するって、どうやってやるんですか?」

先生

「そのためにはsealed(シールド)というキーワードを使います。詳しく説明しましょう!」

1. C#のsealed(シールド)とは?

1. C#のsealed(シールド)とは?
1. C#のsealed(シールド)とは?

sealed(シールド)とは、C#で「これ以上継承させたくない」と明示するためのキーワードです。

通常、クラスは「親クラス」として子クラスから継承されることができます。しかし、システムの設計上「このクラスはこれ以上拡張されたくない」と思う場合があります。そんなときにsealedを使います。

たとえば、重要な処理やセキュリティに関わる処理などを行うクラスは、誰かに勝手に拡張されると問題になる可能性があります。

sealedを使うことで、安全性や設計の意図を守ることができます。

2. sealedクラスの基本的な使い方

2. sealedクラスの基本的な使い方
2. sealedクラスの基本的な使い方

クラスにsealedをつけると、そのクラスは他のクラスから継承することができなくなります。

以下はsealedキーワードを使ったクラスの例です。


sealed class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

このように書かれたCalculatorクラスは、他のクラスが: Calculatorのようにして継承することはできません。


// エラーになります!
class MyCalc : Calculator
{
}

エラー CS0509: 'MyCalc': 'Calculator' は sealed 型であるため、これを継承できません。

3. sealedメソッドの使い方

3. sealedメソッドの使い方
3. sealedメソッドの使い方

sealedは、メソッドにも使うことができます。ただし、sealedメソッドは、overrideしたメソッドに対してのみ使うことができます。

これは、「親クラスではオーバーライドを許可するけれど、子クラスではそれ以上のオーバーライドは禁止したい」という場面で使います。

以下の例を見てみましょう。


class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("動物が鳴きます。");
    }
}

class Dog : Animal
{
    public sealed override void Speak()
    {
        Console.WriteLine("ワンワン!");
    }
}

// さらに継承しようとすると…
class SuperDog : Dog
{
    // これはエラーになります!
    public override void Speak()
    {
        Console.WriteLine("超ワンワン!");
    }
}

エラー CS0239: 'SuperDog.Speak()': オーバーライド メンバーは sealed にできません。

sealed overrideと書くことで、それ以上のオーバーライドを防ぎます。

4. sealedを使うメリットとは?

4. sealedを使うメリットとは?
4. sealedを使うメリットとは?

sealedを使うことで、意図しないクラスの拡張を防ぐことができます。これはセキュリティプログラムの保守性を高める上で大切です。

たとえば、次のような場合に役立ちます。

  • 内部ロジックを固定しておきたいクラス
  • 動作の一貫性を守りたいとき
  • 誤った使い方を防ぎたいライブラリの公開

また、処理速度の最適化にもつながるケースがあります。sealedクラスは、C#の内部で「このクラスはこれ以上継承されない」と確定しているため、JITコンパイラが高速化の工夫をしやすくなります。

5. sealedとabstractの違いに注意しよう

5. sealedとabstractの違いに注意しよう
5. sealedとabstractの違いに注意しよう

abstract(抽象)クラスは、「このクラスは必ず継承して使うもの」という意味でした。

一方で、sealed(封印)クラスは、「これ以上は継承させない」という正反対の意味になります。

つまり、abstractとsealedは相反する概念なので、同時に使うことはできません。


// 以下はコンパイルエラーになります
sealed abstract class MyClass
{
}

エラー CS0418: 'MyClass': 抽象型と sealed 型の両方にはできません。

6. sealedはいつ使えばいい?

6. sealedはいつ使えばいい?
6. sealedはいつ使えばいい?

sealedは、必要以上に使いすぎると柔軟性がなくなります。次のような場合に使うとよいでしょう。

  • このクラスを拡張されると危険、または意味がなくなる場合
  • APIやライブラリを外部に公開するときに、動作を固定したい場合
  • 設計の意図として継承させたくない場合

一方で、「いつか拡張されるかもしれない」と考える場合は、sealedを使わずにおくことで将来の柔軟性が保たれます。

まとめ

まとめ
まとめ

C#におけるsealedキーワードは、クラスやメソッドの継承を制限するための非常に重要な機能です。ソフトウェア開発の中で、「このクラスはこれ以上拡張されるべきではない」と判断される場面は意外と多くあります。たとえば、セキュリティに関わる処理を行うクラスや、ライブラリ内で一貫した動作を保証したいクラスなどは、継承による予期せぬ変更がバグや不具合の原因となることがあります。

sealedをクラスに付けることで、子クラスからの継承を禁止し、そのクラスの構造と振る舞いを固定できます。これにより、想定外の使い方や、コードの乱れを未然に防ぐ効果があります。また、パフォーマンス面でも利点があり、JITコンパイラが最適化を行いやすくなるため、実行速度が向上する可能性もあります。

一方で、sealedは万能ではなく、適切な場面で使うことが求められます。むやみにクラスやメソッドにsealedをつけてしまうと、後々の機能追加やカスタマイズが難しくなってしまいます。そのため、「このクラスは拡張されることで危険がある」「動作を一貫させたい」「外部に提供するAPIの仕様を守りたい」といった明確な理由があるときに使うのが望ましいでしょう。

さらに、メソッドへのsealed指定も有効な手段です。特に、親クラスでオーバーライドされたメソッドに対して、「これ以上のオーバーライドは許可しない」と明示することで、メソッドの振る舞いが変わることを防ぎ、予測しやすく安全な設計が可能になります。

以下は、クラスとメソッドそれぞれでsealedを使った例の再確認です。


// クラスに sealed を使う例
sealed class Logger
{
    public void Write(string message)
    {
        Console.WriteLine($"ログ出力: {message}");
    }
}

// メソッドに sealed を使う例
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("なにかの動物が鳴きました。");
    }
}

class Cat : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("ニャー!");
    }
}

このように、C#のsealedは、設計の意図を明確にし、コードの安全性と保守性を高めるための効果的なキーワードです。継承の自由度を制限することで、コードの変更範囲をコントロールしやすくなり、大規模なプロジェクトやチーム開発でもトラブルを回避する手段となります。

プログラムの柔軟性を大切にしながらも、必要なところではしっかりと制限を設ける。そのバランスを意識することが、良い設計への第一歩です。

先生と生徒の振り返り会話

生徒

「先生、sealedって“封印”っていう意味がぴったりですね!継承を止められるのが便利です。」

先生

「その通り。sealedを使えば、クラスの使われ方をコントロールできるようになるんだ。」

生徒

「でも、使いすぎると後から変更したくなったときに困るってこともあるんですよね?」

先生

「うん。将来的に拡張の可能性があるクラスなら、あえてsealedを使わずに柔軟性を残しておくのも大切だね。」

生徒

「sealedクラスとabstractクラスが逆の性質を持ってるのも面白かったです。」

先生

「sealedは“継承禁止”、abstractは“継承必須”。まさに正反対だから、混在できないんだ。」

生徒

「これでクラス設計の考え方がちょっとわかった気がします!自分でクラスを作るときに活かしたいです!」

先生

「すばらしい心構えだね。sealedの使いどころを意識できれば、より安定したプログラムが書けるようになるよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#のsealedクラスとは何ですか?初心者でもわかる簡単な説明を知りたいです。

C#のsealedクラスとは、「これ以上継承してはいけない」と制限されたクラスのことです。他のクラスがそのクラスを継承することができないため、安全性や保守性を高めるために使われます。
カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方