13

C# 4.0 のExpandoObjectはプロトタイプベースの継承をサポートしていますか? そうでない場合は、なぜですか (それは設計によるものですか?)、また、これをどのように実装できますか? はいの場合、それはどのように機能し、Javascript での機能と比較してどのような違いがありますか?

4

1 に答える 1

21

C# 4.0 の ExpandoObject はプロトタイプベースの継承をサポートしていますか?

まず、ExpandoObject クラスは C# 4.0 とはまったく関係がないことに注意してください。C# チームは、このオブジェクトを設計または実装していません。C# 4.0 と ExpandoObject クラスの両方がたまたま最新バージョンの .NET に同梱されているだけです。

あなたの質問に答えるために、ExpandoObjectのドキュメントを参照してください。

ExpandoObject クラスは、メンバーの取得、設定、および呼び出しを可能にする動的オブジェクト概念の実装です。独自の動的ディスパッチ セマンティクスを持つ型を定義する場合は、DynamicObject クラスを使用します。

ドキュメントに記載されているように、メンバーの単なる呼び出し以上にカスタム ディスパッチ セマンティクスが必要な場合は、DynamicObject クラスを使用します。

そうでない場合、なぜですか?それは設計によるものでしたか?

expando オブジェクトが必要な人もいるかもしれませんが、その人はプロトタイプの継承を望んでおらず、必要もないかもしれません。Expando オブジェクトは、論理的に継承の形式を必要としません。

これはどのように実装できますか?

DynamicObject オブジェクトを使用します。独自のプロトタイプ継承メカニズムを記述します。

はいの場合、それはどのように機能し、Javascript での動作との違いはありますか?

JScript の継承とまったく同じ独自のプロトタイプ継承を記述しようとしている場合は、ECMAScript 仕様を非常に注意深く読むことをお勧めします。プロトタイプの継承は単純に見えますが、ほとんどの人が誤解している微妙な点があります。たとえば、JScript の専門家でさえ、この小さなパズルをよく間違えます。この JScript コードは何を出力しますか?

var Animal = new Object(); 
function Reptile() { } 
Reptile.prototype = Animal; 
var lizard = new Reptile(); 
print(lizard instanceof Reptile); // this is true
print(lizard.constructor == Reptile);  // is this true or false? explain your answer!

プロトタイプの継承は、常に思いどおりに機能するとは限りません。これが出力する内容とその理由については、この件名に関する私の記事を参照してください。

于 2010-05-31T15:04:32.053 に答える