C#4.0的ExpandoObject是否支持基于Prototype的继承?

时间:2010-05-31 10:04:02

标签: c# c#-4.0 prototypal-inheritance expandoobject

C#4.0的ExpandoObject是否支持Prototype-based inheritance?如果没有,为什么不(它是否按设计?)以及如何实施?如果是,它是如何工作的,与它在Javascript中的工作方式相比有什么不同?

1 个答案:

答案 0 :(得分:21)

  

C#4.0的ExpandoObject是否支持基于Prototype的继承?

首先,请注意ExpandoObject类与C#4.0没有任何关系。 C#团队没有设计或实现这个对象。 C#4.0和ExpandoObject类恰好都附带了最新版本的.NET。

要回答您的问题,我建议您访问ExpandoObject的documentation,其中明确指出:

  

ExpandoObject类是动态对象概念的一种实现,它支持获取,设置和调用成员。如果要定义具有自己的动态分派语义的类型,请使用DynamicObject类。

正如文档所述,如果您希望自定义调度语义仅仅是调用成员,那么请使用DynamicObject类。

  

如果没有,为什么不呢?它是按设计的吗?

有人可能想要一个expando对象,但该人可能既不想要也不需要原型继承。 Expando对象在逻辑上不需要任何形式的继承。

  

如何实施?

使用DynamicObject对象。编写自己的原型继承机制。

  

如果是,它是如何工作的,并且它在Javascript中的工作方式存在差异?

如果您正在尝试编写与JScript完全相同的原型继承,我建议您仔细阅读ECMAScript规范 very 。原型继承看起来很简单,但是大多数人都错了。例如,即使是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!

原型继承并不总是像你想象的那样工作!有关此内容及其原因的说明,请参阅my article on the subject