2

私はより良い感覚を得ようとしていますRuby。したがって、RubyはMixinsファーストクラスのコンセプトを作ります。でその行為をC#作成することができます。したがって、どちらの手法も、として広く知られているメカニズムを提供します。Extension MethodsInterfacesMixin

特定の例で両方のアプローチを比較するとよいでしょう。

Rubyで列挙可能

コレクションで機能するすべての美しいメソッドを取り上げましょう。Rubyでは、これらは、、all?およびその他多数です: http: //ruby-doc.org/core-1.9.3/Enumerable.htmlany?count

ドキュメントから: 列挙可能なミックスインは、いくつかのトラバーサルメソッドと検索メソッド、およびソート機能を備えたコレクションクラスを提供します。クラスは、コレクションの連続するメンバーを生成するメソッドをそれぞれ提供する必要があります。

C#で列挙可能

には、これらのメソッド、、などを提供するという機能C#があります。LINQAllAnyCount

クラスを""にしたい場合は、概念的にルビーのアプローチに非常に近いメソッドも提供するように強制するインターフェースをLINQ enabled実装する必要があります。IEnumerable<T>GetEnumerator

したがって、鳥の観点から、あなたのクラスは今、上記のすべての方法を習得しました。それはどのように起こったのですか?

.NETこれらすべてのLINQメソッドをインターフェースExtension Methods上で明確に定義しました。IEnumerable<T>そして、このインターフェースを実装したので、これらすべてのメソッドを「ミックスイン」します。

両方のアプローチがどれほど違うのだろうか、そしてそれがRuby MixinsできることがあるのならC#'s Interface+Extension Method戦略はできないのだろうか?Ruby Mixinsまあ、実行時に混合できるという事実のほかに。

4

2 に答える 2

4

これらは概念的には非常に似ていますが、C#のバージョンはより保守的です。RubyMixinsはプライベートインスタンス変数にアクセスし、プライベートメソッドを定義したり、メソッドを置き換えたりすることもできます。C#拡張メソッドはパブリックメソッドのみを定義でき、特別なアクセス権は取得しません。

Ruby Mixinsは実際にクラスを変更しますが、拡張メソッドはメソッドディスパッチトリックです(コンパイラは「Foo()という名前のインスタンスメソッド?拡張メソッド?はい?代わりにこの静的メソッドの呼び出しとしてこれを発行します」と言います")。

もう1つの違いは、拡張メソッドがスコープされているのに対し、ミックスインはスコープされていないことです(Rubyファイルで必要なミックスインを指定することはできません。他の場所で宣言されると、永久にボルトで固定されます)。Rubyはこれを追加することについて話しました(「仕様」などの名前がありますか?)が、結局はかなり複雑になります。

于 2012-09-26T08:36:17.510 に答える
0

ミックスインは、スーパークラスによってパラメータ化されたクラスです。拡張メソッドとはまったく関係がないので、それらを比較することすら意味がありません。

于 2012-09-25T14:12:57.720 に答える