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