7

VS 编译器不允许为 WINMD 类型库创建密封的公开类型。

为什么要设置这个限制?(我知道密封类型的优势,我的问题是关于 Win RT 组件)。

4

2 回答 2

4

这是 COM 强加的架构限制。它位于任何 WinRT 类型的核心,它们派生自 IUnknown 和 IInspectable。COM的问题在于它只支持接口继承,不支持实现继承。这是一个强大的 COM 设计目标,实现继承充满了实现细节,包括臭名昭著的钻石问题。

有一种方法可以通过委托进行继承,派生类中的每个方法都显式调用相应的基接口方法,但是自己做很痛苦。但除此之外,Windows.UI.Xaml 类实现继承的方式。

于 2012-05-08T12:04:07.683 回答
1

我相信原因是因为暴露的类型应该可以用于所有不同类型的语言(C#、C++、JavaScript 将来可能更多)。

因此,如果您有一个类,那么类的用途之一就是将其覆盖到新类中。我可能想超越类,这是用不同的语言完成的。但这是一个问题。您想如何通过在 C++ 中完成的继承类覆盖在 C# 中完成的基类?这永远行不通,因为它们都具有完全不同且不兼容的 OOP 实现。

通过强制密封暴露的类,您消除了这个问题并确保人们不会尝试做这样的事情。

我敢肯定还有比这更基本的东西,但这是我首先想到的。

于 2012-05-08T10:59:26.950 回答