background image

实例解析 C++/CLI 中的接口与泛型

接口

  某些时候,让不相关的类分享一组公有成员,以便产生相同的行为,是非常有用的。
一个最基本的方法可能是通过一个公共的基类来定义它们,但这种方法太受局限,因为
它要求这些类通过继承而互相关联,另外,它们也许还有着各自的基类,且 CLI 类型只
支持单一类继承。

  C++/CLI 提供了一种方法,可利用多个类实现一组通用的功能,这就是我们通称
的"接口",而一个接口则是一组成员函数的声明。要注意,这些函数只是声明,没有定义,
也就是说,一个接口定义了一个由抽象函数组成的类型--这些函数实际上是纯虚函数,
且在适当的时候,这些函数由客户类来实现。一个接口可允许不相关的类用同一名称和类
型,实现同一功能,而无须要求这些类分享公共基类。在例 1 中演示了怎样定义一个接口。

  例 1:

using namespace System;
public interface class ICollection
{
 void Put(Object^ o); //隐式 public abstract
 Object^ Get(); //隐式 public abstract
};

  一个接口的定义看上去非常像一个类,除了用 interface 取代了 ref 或 value,所有的函
数都没有函数体,且均隐式为 public 和 abstract。按照通常的约定,一个接口名带有起始字
母 I,后再接一个大写字母。(接口类与接口结构是等价的。)与类相似,一个接口也能有
public 或 private 访问可见性。

  一个接口能有一个或多个"基接口",在这种情况下,它将继承这些接口中的所有抽
象函数,例如,在例 2 中,接口 I2 显式继承自 I1,而 I3 显式继承自 I1 与 I2,并通过 I2
隐式继承自 I1。

  例 2:

interface class I1 { /* ... */ };
interface class I2 : I1 { /* ... */ };
interface class I3 : I1, I2 { /* ... */ };