作为一个例子(以及我的问题的原因),从我从ILDASM显示的WinMD信息中可以看到,类Windows.XAML.Media.Transform没有定义的构造函数。
但是如果我尝试从该类派生,在我的C#项目中,编译器会抱怨可以找到非构造函数。
在我看来,这可能是构造函数隐藏可见性的结果。
在C#声明私有(或内部)构造函数时可以实现相同的效果,但必须声明它,否则编译器会创建公共构造函数,并且该类确实是可派生的。
任何提示?
答案 0 :(得分:3)
我认为这里发生的是,该类已显式声明了一个内部(默认)构造函数,没有公共构造函数,因此开发人员可以从定义程序集中的类继承。在集会之外的其他所有人都无法继承本课程。
答案 1 :(得分:0)
WinRT是COM概念的演变,是一个完全不同的故事,因为我们讨论的是二进制组件而不是源继承。 这个ABI故事中最重要的一点是,可以使用的组件中唯一可以通过接口暴露的东西。 构造函数不能在接口中定义,也不能在静态中定义,这意味着WinRT也需要这些接口。
WinRT组件的C#视图是语言投影的工件,而不是组件的真实布局。 要完全理解其中的内容,您应该使用本机库WRL来查看C ++中的组件,该库是用于构建WinRT API的库。
构造函数是WinRT组件工厂界面的投影(和静态,WinRT的新版本,因为它们在COM中不存在,具有相似的处理方式)。
当您从C#对象“新建”时,首先会创建与该组件关联的Factory组件。在此之后工厂创建对象。 由于这个原因,构造函数问题应该从工厂组件而不是构造函数(存在于底层实现中,但它并不重要,因为你看到的组件只是它的二进制契约,ABI)
所以有不同的选择: 1.工厂不存在,您无法创建组件。如果Factory界面是内部的,则无法使用它,也无法创建对象。 2.工厂存在并公开默认构造函数。在C#中,您可以新建对象 3.存在自定义工厂并公开自定义构造函数(whit参数)。
ITransformFactory是私有的,我相信这可以解释你所看到的行为。
关于这个主题还有很多,因为WinRT聚合是他们提供二进制继承和版本控制的方式,但这是另一个(很长的)故事。
仍在挖掘,永不停止,这是我们工作的有趣部分:)