[解決済み】C#で抽象的な静的メソッドを持つことができないのはなぜですか?
質問
私は、これまで プロバイダ 抽象的な静的メソッドを持つ抽象的なクラスを持ちたいという興味深い状況に出くわしました。このトピックに関するいくつかの投稿を読んで、なんとなく理解できたのですが、明確な説明はあるのでしょうか?
どのように解決するのですか?
静的メソッドは インスタンス化 オブジェクトの参照がなくても利用可能です。
静的メソッドの呼び出しはオブジェクトの参照ではなくクラス名を通して行われ、呼び出すための中間言語(IL)コードは、必ずしも使用したクラス名ではなく、抽象メソッドを定義したクラス名を通して呼び出すことになるのです。
例を示そう。
以下のようなコードで。
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
B.Testを呼び出すと、こんな感じ。
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
次に、Mainメソッド内の実際のコードは次のようになります。
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
見ての通り、A.Test を定義したのは A クラスなので、呼び出し先は B.Test ではなく、そのようにコードを書くことができるにもかかわらず、A.Test になっています。
もし、あなたが クラスタイプ Delphiのように、オブジェクトではなく型を参照する変数を作ることができれば、仮想的な、つまり抽象的な静的メソッド(およびコンストラクタ)をもっと活用できるはずですが、これらは利用できず、したがって.NETでは静的呼び出しは非仮想的なものとなります。
IL設計者は、B.Testを呼び出すようにコードをコンパイルし、実行時に呼び出しを解決することを許可することはできますが、それでも、そこに何らかのクラス名を書かなければならないので、仮想にはなりませんね。
仮想メソッド、つまり抽象メソッドは、実行時にさまざまな種類のオブジェクトを格納できる変数を使用する場合にのみ有効で、その変数に格納されている現在のオブジェクトに適したメソッドを呼び出すことができます。静的メソッドでは、とにかくクラス名を調べる必要があり、そのため、呼び出すべき正確なメソッドはコンパイル時に分かっています。
このように、.NETでは仮想・抽象の静的メソッドは使用できません。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] C#でHashtableよりDictionaryが好まれる理由とは?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] クラス内の項目の並び順。フィールド、プロパティ、コンストラクター、メソッド
-
[解決済み] 既存の静的クラスに拡張メソッドを追加することはできますか?
-
[解決済み] なぜC#は静的メソッドにインターフェイスを実装できないのか?
-
[解決済み] なぜ「public static const string S = "stuff";」をクラスで使用できないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み] なぜJavaでは静的メソッドを抽象化できないのですか?