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

luv*_*ere 13 c# prototypal-inheritance expandoobject c#-4.0

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

Eri*_*ert 21

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

首先,请注意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!
Run Code Online (Sandbox Code Playgroud)

原型继承并不总是像你想象的那样工作!有关这些内容及其原因的解释,请参阅我关于此主题的文章.