2011-08-05 7 views
6

Microsoftは、作成するクラスに拡張メソッドを使用するのはなぜですか?メソッドをクラスに追加するだけでなく、子クラスを作成するのではなく、Microsoftが独自のクラスに拡張メソッドを使用するのはなぜですか?

+1

一般的にこれに答えることは非常に難しいでしょう。具体的な例を挙げてください。 –

+0

これを以下に述べましたが、 'RouteCollection'コレクションの' IgnoreRoute() 'メソッド –

答えて

12

Microsoftがこれを行った理由はたくさんあります。 2つの最大の存在:

  1. 拡張メソッドは、クラスだけでなくインターフェイスにも適用されます。 MicrosoftがLinqメソッドをIEnumerableに直接追加しただけであれば、それらのメソッドを実装するためには、そのインターフェイスのあらゆる具体的な実装が必要でした。既存のIEnumerable <>ビヘイビアの形で記述された拡張メソッドを作成することにより、すべてのIEnumerable <>クラスがそれらを自動的に取得します。

  2. 3.0および3.5フレームワークでは、コアSystem.dllは2.0ライブラリです。 System.Coreや他の関連ライブラリで3.0の新しい3.5のすべてが追加されました。たとえば、リストにある<クラスの新しいメソッドを取得する唯一の方法は、3.5には存在しますが2.0には存在しません.3.5ライブラリで拡張メソッドを使用することです。 RouteCollection

+0

また、eric lippert [これについてブログしました](http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx) – bottlenecked

-1

私の2セント:

拡張メソッドのみの.NETフレームワークのそれ以降のバージョンで追加されたので、彼らはすでに.NETフレームワーク1、1.1、2.0以降は、次に、いくつかの点で彼らに拡張メソッドを追加しましたそれらを使用して既存のクラスの上にフィーチャーセットを豊かにしました。

+1

なぜこれが理由ですか? Linq拡張メソッドを見てみましょう。 linqメソッドを使用するには、.NET Framework 3.5以降を使用する必要があります。あなたは.Net 1、1.1、または2.0を使い続けることはできず、とにかくlinqメソッドを使います。だからあなたは.Net 3.5に移行しなければならず、linqがListなどのクラスで実装されていても、mylist.Where()。Select()... –

2

IgnoreRoute()それはMVCフレームワークではなく、コアASP.NETアプリケーションで使用するために意図されているため、拡張メソッドです。私の推測では、RouteCollectionクラスを、MVC以外のアプリケーションでは不要なメソッドで汚染したくないと思っていたのですが、MVCアプリケーションでクラスを利用できるようになりました。

私は、このアプローチが必ずしも意味をなさないとは思っていません(例えば、子クラスを作成したばかりなので)。拡張メソッドが使用される可能性があるより一般的な理由から、他の人がうまく答えています。

+0

MVCは.NET 2 - > 3のような別のケースです強化。ほとんどの基本クラスはMVC以外のASP.NETと同じですが、MVCフレームワークではMVC機能を使用して同じクラスを「うまく動作させる」ことを望んでいます。子クラスを派生させることは技術的にはうまくいくが、「哲学的には間違っている」のである。実際には2つのRouteCollectionクラスは存在しない。 1つのクラスがあり、MVCフレームワークに「アップグレード」すれば、よりスマートになります。 –

0

これは、Non-Virtual Interfaceパターンの例です(Template Methodに似ています)。これは、複数の(実装)継承を持つ言語で使用されるパターンであり、C#でそれを行う方法は拡張メソッドを使用することです。

基本的な考え方は、非仮想および純粋仮想(抽象)メソッドのみを使用することです。インターフェイスの実装者(またはクラス/ mixinの継承者、複数の継承を持つ言語)は、小さなメソッドまたはメソッドのセット(この場合はGetEnumerator)を実装し、それに応じて、

Michael Edenfieldが答えたところでは、このパターンを念頭に置いてIEnumerableをインターフェイスにしたい場合は、拡張メソッドを使用する必要があります。そして、IEnumerableを抽象クラスにすることは、非常に低コストで基本的なインターフェースであると考えられています。IEnumerableを実装すると、クラス階層を再考する必要はありません。 "

0

主な理由は、そのようなメソッドを拡張するのは非常に簡単だと思います。例えば、Linqの拡張メソッドの場合は、あなた自身の拡張メソッド(おそらくforeachまたは特定のフィルタ)を簡単に書くことができます。これは、Microsoftメソッドでgreateを実行します:mylist.Where(...)。MyFilter(...)。選択(...)

関連する問題