C# 4.0 的ExpandoObject是否支持基于原型的继承?如果不是,为什么不(这是设计使然?)以及如何实施?如果是,它是如何工作的,与它在 Javascript 中的工作方式相比有什么不同?
1 回答
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!
原型继承并不总是像你想象的那样工作!有关打印内容和原因的说明,请参阅我关于该主题的文章。