2012-05-08 56 views
7

VS編譯器不允許爲WINMD類型庫創建密封的暴露類型。爲什麼暴露的類型必須爲WinMD/WinRT組件密封?

爲什麼放置此限制? (我知道密封類型的優點,我的問題是關於Win RT組件)。

+4

你的標題似乎不同意這個問題? (「必須密封」與「不允許密封」) –

回答

4

這是由COM強加的體系結構限制。它位於任何WinRT類型的核心,它們來自IUnknown和IInspectable。 COM的問題是它只支持接口繼承,但不支持實現繼承。這是一個強大的COM設計目​​標,實現繼承對實現細節太困難,包括臭名昭着的鑽石問題。

有一種方法可以通過委託來繼承工作,派生類中的每個方法都會顯式調用相應的基本接口方法,但這對您自己來說是非常痛苦的。但除此之外,Windows.UI.Xaml類實現繼承的方式。

+0

這回答了這個問題。特別感謝提及鑽石問題 – Tilak

+1

這不太準確,可以實現未密封的winrt類,但是它們不能從JavaScript中使用,並且它們需要使用低級別(IDL)創作體驗,這對於Visual Studio來說可能頗具挑戰性。另外,所有派生類(密封或未密封)必須最終從Windows命名空間中的類派生。 –

+0

你能指出任何支持文件嗎?我想看看,怎麼做到這一點。 在我的情況,我需要它在VS內,但它是值得的,知道事情發生在後臺 – Tilak

1

我相信原因是因爲暴露的類型應該可以從所有不同類型的語言(C#,C++,JavaScript,將來可能更多)使用。

所以如果你有一個類,那麼一個類的使用就是將它重寫成新的類。我可能想要上課,這是用不同的語言完成的。但這是一個問題。你想如何重寫在C#中完成的基類,通過在C++中完成的繼承類?這是行不通的,因爲這兩者都具有完全不同且不兼容的OOP實現。

通過強制暴露的類被封閉,您可以刪除此問題並確保人們不會嘗試這樣做。

我相信還有比這更基本的東西,但這是我首先想到的。

相關問題