为什么WinRT类型必须密封?

Joe*_*ite 10 interop sealed windows-runtime

在几个地方(例如" 在MSDN上创建用于JavaScript的Windows运行时组件,在C#和Visual Basic中 "),我已经看到它指定,如果您在.NET中编写要从JavaScript使用的类,那么您必须把它变成一个密封的课程.

这似乎是一种任意限制.为什么JavaScript只适用于密封类?

Rei*_*man 7

暴露给JavaScript应用程序的Windows运行时对象是从JavaScript角度密封的 - 您无法将expando属性添加到WinRT对象.但是从C++和C#,如果对象支持继承,则可以继承winrt对象(例如,大多数Xaml类支持继承,但大多数其他类不支持继承).

WinRT对象与JS密封的原因是确保winrt对象的行为相同,无论应用程序做了什么 - 如果应用程序重新定义对象的某些功能属性,它可能会导致应用程序的其他部分出现异常.

  • @Hans:这与COM完全无关.Windows运行时是*不是*COM(它有一些COM的元素,但它*非常*不同).运行时DOES支持继承 - 正如上面提到的Pavel,您可以从C++/CX或C#/ VB中的FrameWorkElement派生. (2认同)
  • 我忍不住做了"源于IUnknown,确实引用计数:它必须是鸭子"测试.期待你在博客上发表这篇文章. (2认同)
  • JavaScript 不仅可以查看密封类。只是其中唯一的非密封类与 Xaml 相关,因此不会暴露给 JavaScript 应用程序。 (2认同)
  • 我确实需要澄清一件事:您将能够从 JS 中看到非密封类型。但是您不能从它们中得出 - 这不受支持。 (2认同)