Why are virtual, abstract and override keywords not valid for Static function? What's the logic behind it?
5 に答える
仮想ディスパッチによるポリモーフィズムは、ターゲットインスタンスの実際の実行時型、つまり実際の内容を使用して実行さobj
れobj.Bar(...args...)
ます。さて、obj.
インスタンスがない場合、ポリモーフィズムについて議論するのは意味がありません。
静的メソッドは、仮想呼び出しではなく静的呼び出しで呼び出されます。呼び出すメソッドの決定は、完全にコンパイル時に行われます。決定は残っていません。それはSomeType
でになりSomeType.SomeMethod(...args...)
ます。もちろん、仮想メソッド内のメソッド間で呼び出すこともできます。引き続きにアクセスできますSomeBaseType.SomeOtherStaticMethod(...)
。
実際、ポリモーフィズムの概念を静的メソッドに拡張する言語が世の中に存在します。ただし、C# はそれらの言語の 1 つではありません。ある種のクラス参照を介して静的関数を呼び出すことは許可されていないため、実際には「多態的」なことを行う機会はありません。
静的メソッドは、メソッドのプレースホルダーとして、実際には特定のクラスの一部にすぎません。静的関数は、宣言されているクラスとライフタイムまたはスコープを共有せず、実際にはオブジェクトモデルの一部ではありません。
これらのキーワード(abstract、virtual、override)は継承モデルに関連しており、静的なコンテキストでは意味がありません。
インスタンスを介して静的メソッドにアクセスするべきではありません。 その場合、C# は変数に含まれるオブジェクトの型を気にしません。変数の型によって異なります。つまり、オブジェクトが参照されないそのすべてをスクラッチします。私のバージョンの Visual Studio では、既定の設定では、インスタンスを介して静的メソッドを使用することさえ許可されていません。いずれにせよ、それMyType obj = null; obj.StaticMethod();
ため、機能します。virtual static
は何の価値もないことを意味します。virtual
オブジェクトを参照override
してどのメソッドを使用するかを決定します。 を使用するとstatic
、タイプのみが得られます (これは実質的にハードコードされているため、ポリモーフィズムでは役に立ちません)。 abstract
基本的に「override
あなたのクラスに が必要」です。
C# の人々にとって、静的なものをオーバーライドできるふりをさせるのは難しくなかったと思いますが、それはできません。それを呼び出すには、タイプを指定する必要があります (明示的に のようMyType.StaticMethod()
に、または上記のように暗黙的に)。彼らは、仮想静的メソッドを持つことができないことを明確にし、それをまったくできないようにすることで、期待どおりに機能させることを選択しました。
キーワードvirtual
、abstract
およびoverride
は、継承されるメソッドで使用されます。静的メソッドは継承されません。