クローズドクラス階層 in .NET 11
.NET 11 プレビュー4で導入された「クローズドクラス階層」機能について解説。この機能により、クラス階層の継承元を特定の型に制限でき、switch式の網羅性チェックが可能になる。従来の抽象クラスやインターフェースでは実現できなかったパターンマッチの改善により、より堅牢で表現力豊かなコードが書けるようになる。
背景メモ
- .NET 11(2025年後半リリース予定)のプレビュー4で導入された「closed class hierarchies(閉じたクラス階層)」機能を解説した記事。C#の継承を制限する新しい仕組みで、従来のsealed(完全な継承禁止)とabstract(強制的継承)の間に位置づけられる。
- 「closed」キーワードを基底クラスに付けると、そのクラスを継承できるクラスを同一アセンブリ内(または同一ファイル内)の明示されたサブクラスだけに限定できる。これにより、ライブラリ開発者が「この型は自分が定義した3つのサブクラスだけで拡張できる」と宣言し、外部ユーザーによる予期しない継承を防げる。
- 従来は「継承を完全に禁止するsealed」か「全ユーザーに開放するpublic継承」の二択だったが、closedはその中間。Javaのsealed class(Java 17)、Swiftのclosed class、Kotlinのsealed classに近い概念で、C#/.NETにもようやく同様の機能が追加されることになる。
- この機能が必要とされる背景には、ライブラリ設計時の「意図された継承ツリー」の保護がある。例えば状態(State)パターンや判別共用体(discriminated union)のような限定的な分岐を持つドメインモデルで、開発者が想定しないサブクラスが後から追加されるリスクを排除できる。