快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

接口

某些时候,让不相关的类分享一组公有成员,以便产生相同的行为,是非常有用的。一个最基本的方法可能是通过一个公共的基类来定义它们,但这种方法太受局限,因为它要求这些类通过继承而互相关联,另外,它们也许还有着各自的基类,且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 { /* ... */ };

一个类可像从基类继承时那样,来实现一个接口,见例3。

例3:

public ref class List : ICollection
{
  public:
   void Put(Object^ o)
   {
    // ...
   }
   Object^ Get()
   {
    // ...
   }
   // ...
};

一个类能实现一个以上的接口,在这种情况下,必须使用逗号来分隔接口列表,顺序倒不是很重要。当然,一个类在实现一个或多个接口时,也能显式地带有一个基类,在这种情况下,基类通常(但不是必须)写在最前面。

如果一个类实现了一个接口,但没有定义接口中所有的函数,这个类就必须声明为abstract。当然了,任何从抽象类继承而来的类也是抽象类,除非定义了之前的这些抽象函数。

接口不提供多重继承,与此相比,一个CLI类也只能有一个基类,然而,接口却提供某种与多重类继承相似的功能,但概念与之完全不同,例如,一个类不能从接口中继承函数定义;接口继承体系是独立于类继承体系的--实现同一接口的类也许会、但也许不会通过类继承体系相互关联。

例4演示了一个类:Queue,其与List无关联(但除了这个外,两者都是从Object继承而来的),两者都实现了同一接口。

例4:

public ref class Queue : ICollection
{
  public:
   void Put(Object^ o)
   {
    // ...
   }
   Object^ Get()
   {
    // ...
   }
   // ...
};

现在,可用它来编写处理参数为List或Queue的函数了,如例5。

例5:

ref class Item { /* ... */ };
void ProcessCollection(ICollection^ c);
int main()
{
  List^ myList = gcnew List;
  Queue^ myQueue = gcnew Queue;
  ProcessCollection(myList);
  ProcessCollection(myQueue);
}
void ProcessCollection(ICollection^ c)
{
  Item^ x = gcnew Item();
  /*1*/ c->Put(x);
  /*2*/ x = static_cast<Item^>(c->Get());
}

在标号1与2中,为访问底层的List或Queue,使用了一个指向接口的句柄c,由此,你可传递给ProcessCollection一个指向任意对象的句柄,只要

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号