静的クラスを継承できないのはなぜですか? 質問する

静的クラスを継承できないのはなぜですか? 質問する

実際には状態を必要としないクラスがいくつかあります。組織の観点から、それらを階層化したいと思います。

しかし、静的クラスの継承を宣言することはできないようです。

そんな感じ:

public static class Base
{
}

public static class Inherited : Base
{
}

動作しないでしょう。

なぜ言語の設計者はその可能性を閉ざしたのでしょうか?

ベストアンサー1

ここから引用:

これは実際には設計によるものです。静的クラスを継承する正当な理由はないようです。静的クラスには、クラス名自体を介していつでもアクセスできるパブリックの静的メンバーがあります。静的クラスを継承する唯一の理由は、入力する文字数を節約するなど、悪い理由でした。

静的メンバーを直接スコープ内に取り込むメカニズムを検討する理由はあるかもしれませんが (実際、Orcas 製品サイクルの後でこれを検討する予定です)、静的クラス継承は適切な方法ではありません。これは使用するメカニズムとして間違っており、静的クラス内に存在する静的メンバーに対してのみ機能します。

(Mads Torgersen、C# 言語 PM)

チャンネル9からのその他の意見

.NET の継承はインスタンス ベースでのみ機能します。静的メソッドはインスタンス レベルではなく型レベルで定義されます。そのため、静的メソッド/プロパティ/イベントではオーバーライドは機能しません...

静的メソッドはメモリ内に一度だけ保持されます。静的メソッド用に作成される仮想テーブルなどはありません。

.NET でインスタンス メソッドを呼び出す場合は、常に現在のインスタンスを渡します。これは .NET ランタイムによって隠されていますが、実際に行われます。各インスタンス メソッドには、メソッドが実行されるオブジェクトへのポインター (参照) が最初の引数としてあります。これは静的メソッドでは発生しません(静的メソッドは型レベルで定義されているため)。コンパイラは、呼び出すメソッドをどのように選択するのでしょうか。

(リトルグル)

そして、貴重なアイデアとして、littleguru はこの問題に対する部分的な「回避策」として、シングルトンパターンを提案しています。

おすすめ記事