分类: C/C++
2008-04-15 21:26:00
来源:赛迪论坛 作者:sixth |
单一的根基类为运行时类型查询和代码生成(通常被称为反射)提供了支持机制 [ 译注 2] ,这是 ISO-C++ 所缺乏的。我们将在今后一系列文章中详细讨论它们给 CLI 带来的动态编程特性。 除此之外, CLI 还支持一种被称作特性元数据( attribute metadata )的构造,它允许我们定义一些特性类,然后将其关联在 CLI 类型和当前正在运行的程序构造上——这有效地扩展了内建于 CLI 中的类型和程序构造。这些用户定义的特性也可以通过反射机制来获得,应用程序则可以根据它们的值来进行条件逻辑判断。这也是 C++/CLI 为 C++ 带来的动态组件编程的一部分。再次强调一遍,类型反射和特性将在我们的专栏中得到深入的讨论。 那么,对于大家来说怎样学习 C++/CLI 呢?学习 C++/CLI 的其中一个要点便是学习底层的通用类型系统( CTS ),它包括以下三种类型: 1. 多态引用类型,其用于所有的类继承。我们将在早期的一些专栏文章中讨论它们。 2. 非多态值类型,其用于实现一些类似于数值类型那样的、对运行时效率要求比较高的类型。我们将其放在引用类型之后讨论。 3. 抽象接口类型,其用于定义一组供引用类型或者值类型实现的操作。接口为多继承提供了一种别样的设计模式。我们也将有一系列专栏文章来讨论它们。 将 CTS 映射为一组语言内置类型对于所有的 CLI 语言都适用,虽然各种语言所使用的语法各不相同。这也是一门 CLI 语言所要面对的第一个设计层面。例如,在 C# 中,我们可以用以下代码来定义一个抽象基类型 Shape (一些具体的几何对象将继承自它)。 public abstract class Shape {…} 而在 C++/CLI 中,我们用下面的代码来定义同样的类型。 public ref class Shape abstract {…}; 除了语法差异之外,两种声明的实际表示完全相同。类似地,在 C# 中,我们可以用下面的代码来定义一个具体类 Point2D 。 public struct Point2D {…} 而在 C++/CLI 中,我们用下面的代码来定义同样的类型。 public value class Point2D {…}; 我们对语法的选择基于如下的出发点:以一种直观的设计视角将 CLI 类型和 ISO-C++ 类型紧密地集成在一起。 因此,简单地说一种语言比另一种语言更接近底层 CLI 并不正确。相反,每一门 CLI 语言都只是表达了自己对底层 CLI 对象模型的一种视图。 |