2016-07-14 22 views
0

をオーバーライド私は、拡張メソッドに関連stackoverflowの記事でこの文を見つけました:拡張メソッドとメソッド先日

異なるのジェネリックパラメータのインスタンスに基づいて異なるメソッドをオーバーライドする能力がある主なものを。これは、それが意味になってどのようなHaskellの型クラス

Java equivalent to C# extension methods

に似ていますか?誰もがこの声明を明確にする重要な例を挙げることができますか?

+0

元のポスターにその質問をしたり、説明を求めないようにしてください。 – GreatAndPowerfulOz

+0

質問のうちどの部分を明確にしたいのですか? C#拡張が何であるか、それらがどのように使用されているか、またはそれらがHaskellタイプに似ているかについての明確化をご希望ですか? –

+0

私は拡張メソッドに精通しています。私は "ジェネリックのパラメータのインスタンス化"に基づいて優先されることを理解していません。それが私の中心的な問題です。 Haskellの型クラスとの比較がコンセプトを説明するのに役立ち、私はそれを感謝します。 – Olaf

答えて

1

私は、C#のコンパイラが最も狭く型を定義するメソッドを選択するということを指していると思います。だから、あなたは抽象クラス(ABS)を持っており、継承されたクラス(CLS2)と2つの拡張メソッド

public static object GetStuff(this ABS obj){ 
    blah blah blah 
} 

    public static object GetStuff(this CLS obj){ 
    blah blah blah 
} 

場合たとえば、あなたがCLS2.GetStuff(呼び出す場合)、コンパイラは第二の方法を選択します。より具体的にすることで拡張方法を「上書き」することができることがわかったら、あなたはあなたが(上記のようなタイプのクラスを使用して)

public static void DoSomething(this Foo<Abs> abs){} 

ここで

public static void DoSomething(this Foo<CLS2> abs){} 

を2つの拡張メソッドを作ることができ

public class Foo<T>{} 

ジェネリッククラスを持っているのであれば第二の方法は、「オーバーライドです"より一般的な"抽象タイプです。

これは、実際にはすべての汎用タイプに対して新しいクラスを生成するため、C#では可能です。 "Type Erasure Generics"を使用するJavaのような言語では、すべてが実際に型オブジェクトであるため、汎用メソッドを "オーバーロード"できません。

+0

C#***は***すべてのジェネリック型に対して新しいクラスを生成しません。これは、ジェネリック型の各使用法に対して、ジェネリック型パラメータの構造化インスタンス化を行う場合にのみ行います。ジェネリック型パラメータのすべてのインスタンス化は、同じクラスインスタンスを共有します。リンク:https://msdn.microsoft.com/en-us/library/f4a6ta2h.aspx: "*ジェネリック型が最初にパラメータとして値型を使用して構築されると、ランタイムは、指定されたパラメータで特殊ジェネリック型を作成しますまたはパラメータがMSILの適切な場所に置換されています。* " –

+0

:" *ジェネリックは、参照型に対して多少異なる動作をします。参照型でジェネリック型を初めて作成したとき、 MSIL内のパラメータの代わりに、参照型をパラメータとして使用して構築された型がインスタンス化されるたびに、ランタイムは以前に作成された汎用型の特殊バージョンを再利用します。すべての参照は同じサイズです。* " –

+0

意味(私はこれを以前は知らなかったことは認めますが)。私の主張は、タイプの消去とは対照的に、実際のタイプを扱っていることです –