C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
C# sealed クラスとメソッドを理解する
このガイドでは、sealed キーワードで継承とメソッドオーバーライドを制限する方法を、実践的なコード例で説明します。
sealed クラス
C# において sealed キーワードはクラスの継承を防ぎます。sealed クラスは決して派生型を持てません。
例:
using System;
namespace SealedClass {
sealed class Animal {
}
// sealed クラスを継承しようとするとコンパイルエラー
class Dog : Animal {
}
class Program {
static void Main (string [] args) {
// Dog クラスのオブジェクト作成
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
コンパイラが出力するエラー:
error CS0509: 'Dog': cannot derive from sealed type 'Animal'
sealed メソッド
仮想メソッドをオーバーライドする際、さらに派生クラスでのオーバーライドを防止したい場合があります。override 宣言に sealed を付けることで実現できます。
例:
using System;
namespace SealedClass {
class Animal {
public virtual void MakeSound() {
Console.WriteLine("Animal Sound");
}
}
class Dog : Animal {
// sealed オーバーライド
sealed public override void MakeSound() {
Console.WriteLine("Dog Sound");
}
}
class Puppy : Dog {
// sealed メソッドをオーバーライドしようとするとコンパイルエラー
public override void MakeSound() {
Console.WriteLine("Puppy Sound");
}
}
class Program {
static void Main (string [] args) {
// Puppy クラスのオブジェクト作成
Puppy d1 = new Puppy();
Console.ReadLine();
}
}
}
結果のエラー:
error CS0239: 'Puppy.MakeSound()': cannot override inherited member 'Dog.MakeSound()' because it is sealed
ヒント: オーバーライド済みメソッドを sealed にすると、多段階継承チェーンでの更なるオーバーライドを阻止できます。
なぜ sealed クラスを使うのか?
- セキュリティと整合性 – sealed クラスは拡張できないため、その振る舞いは予測可能で、サブクラスによる改変から保護されます。
- パフォーマンス – ランタイムはサブクラスが存在しないことを知っているため、sealed 型をより積極的に最適化できます。
- 静的ユーティリティ型 – 多くのライブラリが sealed クラス経由で静的メンバーを公開します(例:System.Drawing の
Pens)。
例えば Pens クラスは標準色の事前構成済み Pen インスタンスを提供します:
Pen bluePen = Pens.Blue; // 青いペンを表す
Pens が sealed なので、その静的メンバーを他の型でオーバーライドまたは変更することはできません。
C言語
- ASTM A729 クラス A: 二重正火・焼戻し鋼 - 主要特性と規格
- ASTM A649 クラス 2 正火・焼戻し鋼 - 仕様と特性
- ASTM A288 クラス4 調質鋼:仕様と特性
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C#の継承:再利用可能で保守しやすいコードを構築する
- C#のポリモーフィズム:静的バインディングと動的バインディングを徹底解説
- Javaオブジェクトとクラス:コアOOP概念を完全理解