1. ホーム
  2. c#

[解決済み】静的クラスの継承ができないのはなぜ?

2022-04-04 09:35:43

質問

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

でも、staticなクラスには継承を宣言できないようです。

そんな感じですね。

public static class Base
{
}

public static class Inherited : Base
{
}

は動作しません。

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

どうすれば解決するの?

引用元 こちら :

これは、実はデザインによるものです。静的なクラスを継承する正当な理由はないように思われます。パブリックな静的メンバがあり、クラス名そのものからいつでもアクセスできるようになっているのです。 私が見た中で、静的なものを継承する理由は、数文字のタイピングを節約するためといった悪いものだけでした。

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

(Mads Torgersen, C# Language PM)

チャンネル9の他の意見

<ブロッククオート

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

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

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

(littleguru)

そして、貴重なアイデアとして リトルグル は、この問題に対する部分的な回避策を用意しています。 シングルトン のパターンがあります。