2011-09-20 108 views
10

在幾個地方(例如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接口中進行接口繼承。 –

回答

7

暴露於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派生,請參考計數:它一定是鴨」的測試。期待您的博客。 –

相關問題