Delphi for .NET 实现了 Delphi 语言的类变量(可以保存对类类型的引用)、虚拟类方法和虚拟构造函数(通过类引用调用)的概念。这些在 CLR 中都没有任何直接的模拟——CLR 中的静态方法不能是虚拟的,构造函数也不能是虚拟的。
由于 CLR 拥有如此丰富的运行时类型信息,因此 CLR 中并不严格需要这些工件。如果您想在运行时在编译时不知道确切类型的代码中构造一个类型的实例,您可以使用反射或其他技术来实现。Delphi 语言的这些特性源于运行时类型信息有限的本地编译的 Win32 产品。这一切都是在 .NET 1.0 和 1.1 上实现的,早在 DLR 之类的东西出现之前。
这些 Delphi 语言特性可以在 CLR 中使用反射来模拟,但出于性能原因,我们选择直接在 IL 中实现它们,方法是创建一个“元类”类型,该类型是 Delphi 中声明的每个类类型的附属。如果 Delphi 代码将 Delphi 类类型分配给类引用变量,我们生成 IL 代码以将相应元类的单例实例分配给该变量。通过类引用变量的虚拟方法调用被代码生成为元类实例上的 IL 虚拟方法调用,它反弹到相应类类型中的实际静态方法实现。这允许类虚方法调用仍然表现多态(调用与用于进行调用的实例类型相适应的实现)并且运行时性能成本最低。
这些虚类方法特性只适用于以 Delphi 语法声明的类,并且只能在 Delphi 语法中使用。我相信元类型被标记为不符合 CLS,因此其他 .NET 语言(很可能)在使用 Delphi 中创建的类时会忽略它们。其他 .NET 语言无法使用这些 Delphi 特定的语言功能(除非开发人员真的下定决心并爬过脚手架以对/通过丑陋的命名元类进行适当的调用)
通常,您不应期望其他语言使用由/为您的语言创建的非 CLS 工件。如果您希望其他语言使用您的语言创建的内容,您将需要弄清楚如何以符合 CLS 的术语以合理的方式表示您的特殊酱汁。根据特殊酱汁的性质,这可能是不可能的。
Delphi 虚拟类方法可用于其他 .NET 语言作为普通静态方法。多态本质并未暴露给其他 .NET 语言,主要是因为 CLS(或其他语言)根本无法表达这一概念。
理想情况下,每一种语言都能够同样好地表达每一种可以想象的结构。但实际上并非如此。一些图形函数在笛卡尔坐标中更容易表达,而另一些则通过使用极坐标得到了极大的简化。编程语言也是如此。
用你自己的语言发明新的表达方式是可以的,即使它是在 CLR 上实现的。如果您希望您的语言的代码被其他人调用,请务必清楚地定义您的类型对于在您的语言之外工作的程序员的外观。您的实现将具有双重性:事物对您的语言用户的看法,以及事物对您语言之外的用户的看法。
脚注:我认为这不适用于适用于 .NET 的 Delphi 新产品 Delphi Prism。我不认为 Delphi Prism 支持虚拟类方法。