1

Why are virtual, abstract and override keywords not valid for Static function? What's the logic behind it?

4

5 に答える 5

3

仮想ディスパッチによるポリモーフィズムは、ターゲットインスタンスの実際の実行時型、つまり実際の内容を使用して実行さobjobj.Bar(...args...)ます。さて、obj.インスタンスがない場合、ポリモーフィズムについて議論するのは意味がありません。

静的メソッドは、仮想呼び出しではなく静的呼び出しで呼び出されます。呼び出すメソッドの決定は、完全にコンパイル時に行われます。決定は残っていません。それはSomeTypeでになりSomeType.SomeMethod(...args...)ます。もちろん、仮想メソッド内のメソッド間で呼び出すこともできます。引き続きにアクセスできますSomeBaseType.SomeOtherStaticMethod(...)

于 2012-06-04T11:03:09.437 に答える
1

実際、ポリモーフィズムの概念を静的メソッドに拡張する言語が世の中に存在します。ただし、C# はそれらの言語の 1 つではありません。ある種のクラス参照を介して静的関数を呼び出すことは許可されていないため、実際には「多態的」なことを行う機会はありません。

于 2012-06-04T15:53:17.590 に答える
0

静的メソッドは、メソッドのプレースホルダーとして、実際には特定のクラスの一部にすぎません。静的関数は、宣言されているクラスとライフタイムまたはスコープを共有せず、実際にはオブジェクトモデルの一部ではありません。

これらのキーワード(abstract、virtual、override)は継承モデルに関連しており、静的なコンテキストでは意味がありません。

于 2012-06-04T11:02:46.950 に答える
0

インスタンスを介して静的メソッドにアクセスするべきではありません。 その場合、C# は変数に含まれるオブジェクトの型を気にしません。変数の型によって異なります。つまり、オブジェクトが参照されないMyType obj = null; obj.StaticMethod();ため、機能します。そのすべてをスクラッチします。私のバージョンの Visual Studio では、既定の設定では、インスタンスを介して静的メソッドを使用することさえ許可されていません。いずれにせよ、それvirtual staticは何の価値もないことを意味します。virtualオブジェクトを参照overrideしてどのメソッドを使用するかを決定します。 を使用するとstatic、タイプのみが得られます (これは実質的にハードコードされているため、ポリモーフィズムでは役に立ちません)。 abstract基本的に「overrideあなたのクラスに が必要」です。

C# の人々にとって、静的なものをオーバーライドできるふりをさせるのは難しくなかったと思いますが、それはできません。それを呼び出すには、タイプを指定する必要があります (明示的に のようMyType.StaticMethod()に、または上記のように暗黙的に)。彼らは、仮想静的メソッドを持つことができないことを明確にし、それをまったくできないようにすることで、期待どおりに機能させることを選択しました。

于 2012-06-04T11:09:57.647 に答える
0

キーワードvirtualabstractおよびoverrideは、継承されるメソッドで使用されます。静的メソッドは継承されません。

于 2012-06-04T11:59:15.343 に答える