快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
t;T>(Length);
    for (int i = 0; i < Length; ++i)
    {
     /*5*/ this[i] = T();
    }
   }
   Vector()
   {
    Length = 0;
    /*6*/ vector = gcnew array<T>(0);
   }
   ~Vector() //多余的
   {
    /*7*/ vector = nullptr;
   }
   virtual String^ ToString() override
   {
    String^ s = "[";
    int i;
    for (i = 0; i < Length - 1; ++i)
    {
     /*8*/ s = String::Concat(s, this[i], ":");
    }
    /*9*/ s = String::Concat(s, this[i], "]");
    return s;
   }
   virtual bool Equals(Object^ obj) override
   {
    if (obj == nullptr)
    {
     return false;
    }
    if (this == obj) //在测试自身吗?
    {
     return true;
    }
    /*10*/ if (GetType() == obj->GetType())
    {
     Vector<T>^ v = static_cast<Vector^>(obj);
     if (Length != v->Length) //是否向量有不同的长度?
     {
      return false;
     }
     for (int i = 0; i < Length; ++i)
     {
      /*11*/ //if (this[i] != v[i])
      if (this[i]->Equals(v[i]) == false)
      {
       return false;
      }
     }
     return true;
    }
    return false;
   }
   /*12*/ virtual int GetHashCode() override
   {
    return 0;
   }
};

如同泛型函数一样,泛型的定义一般由generic <typename t1, ..., typename tn>打头,意思是通过tn引入了类型参数t1,这些参数的作用范围,可从类型定义的结束直到它们所依附的对象。在本例中,只有一个类型参数T。

在标号1中可见,一个Vector是作为一个类型为T的元素数组存储的。

在标号2中,定义了一个默认的索引属性,以便可用一个int下标值来访问一个Vector。当然了,在运行时,我们可以存取类型为T的元素,而不用管它实际上是什么类型。

与其直接访问私有成员,倒不如通过公有属性来进行访问,比如说,用Length来取代length;使用下标来访问当前的Vector(标号3)时,我们使用了this[i]。在此,很有可能会想到使用for each循环来取代一般的老式for循环,如标号4,但是,在此使用for循环是行不通的。在for each循环中,通过命名在循环结构中的局部变量,可为每个元素都产生一个副本,也就是说,变量已经不是原来的元素了,因此,修改它的值不会改变元素的值。

在标号5中,需要把每个元素设为默认值,幸运的是,标准C++要求每种类型都有一个默认的构造函数--甚至对不是类的类型也是这样,一般表示为类型名后紧跟空的圆括号。

程序在构造函数没有参数的情况下(标号6),分配了一个零元素数组。(注意,指向零元素数组的句柄,不等同于包含nullptr的句柄。)这样做的目的是为了让成员函数可以正常工作,甚至对空Vector也是如此。

为了完整起见,还定义了一个析构函数,以把句柄设为nullptr,目的是为了显式地告之垃圾回收器,我们对这个对象及与之关联内存的工作已经完成。

使用在标号8及9中的this[i]还是真有点让人糊涂,那它真正的目的是什么呢?不像等价的模板类,泛型类Vector是在类型T未知的情况下编译为一个程序集,如果编译器不知道T的类型,它也不知道this[i]的类型,因此,它该怎样生成代码,才能把这个表达式转换为Concat所期望的类型呢?其实它不必知道,Concat的其中一个重载版本会要求它的第二个参数为Object^类型,且因为this[i]有类型

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号