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 回答