为什么WinRT类型必须密封?

问题描述:

在几个地方(例如MSDN上的“Creating Windows Runtime Components for JavaScript, in C# and Visual Basic”),我已经看到它指定了如果你在.NET中编写一个你想从JavaScript中使用的类,那么你必须把它作为一个密封的类。为什么WinRT类型必须密封?

这似乎是一个任意的限制。为什么JavaScript只能使用密封类?

+6

由于WinRT构建在COM之上,COM不支持继承。 * sealed *关键字可以确保对任何看到代码的人都很清楚,这种类不能通过继承来扩展。 –

+1

@Hans实际上WinRT本身支持某种形式的继承 - 例如你可以在.NET中继承FrameworkElement(它本身就是一个WinRT类)。而且您不必将C++/CX中定义的类标记为密封类,并且也可以继承它们。所以这似乎只是在.NET中对WinRT组件进行自动调整的限制,而不是WinRT本身的(COM继承)限制。 –

+4

@Hans:COM支持继承。尽管如此,我们不允许在winrt接口中进行接口继承。 –

暴露于JavaScript应用程序的Windows运行时对象从JavaScript透视图被密封 - 您无法将expando属性添加到WinRT对象。但是从C++和C#开始,winrt对象可以继承如果对象支持继承(大多数Xaml类支持继承,但大多数Xaml类不支持)。

WinRT对象与JS密封的原因是为了确保winrt对象的行为相同,无论应用程序做了什么 - 如果应用程序重新定义对象的某个函数属性,它可能会导致应用程序的其他部分行为不端。

+0

对C#的限制相同,请在此视频的40:15处查看:http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-531T COM不支持实现继承。 –

+2

@Hans:这和COM完全没有关系。 Windows运行时不是* COM(它有一些COM元素,但它非常*不同)。运行时支持继承 - 正如上面提到的Pavel,您可以从C++/CX或C#/ VB中的FrameWorkElement派生。 –

+2

我不禁要做“从IUnknown派生,请参考计数:它一定是鸭”的测试。期待您的博客。 –