快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
它的类实现了这个接口,或者它是从实现了这个接口的类继承而来的。

例6演示了一个包含只读属性X、只写属性Y、读写属性Z的接口,对读写属性来说,get与set声明的顺序并不重要。

例6:

public interface class IProperties
{
  property int X { int get(); }
  property String^ Y { void set(String^ value); }
  property Object^ Z { Object^ get(); void set(Object^ value); }
};

一个接口的成员,可以为静态数据成员、实例或静态函数、静态构造函数、实例或静态属性、实例或静态事件、操作符函数、或任意的嵌套类型。

一般来说,我们会用for each语句来枚举集合中的所有元素,要对集合中的每个元素逐个进行操作,可使用如下语法:

for each (表达式形式的类型标识符)

嵌入语句

表达式类型必须为一个"集合类型",如果要成为一个集合类型,这个类型必须实现接口System::Collections::IEnumerable,如例7中所定义。

例7:

public interface class IEnumerable
{
  IEnumerator^ GetEnumerator();
};

正如大家所见,GetEnumerator返回一个指向IEnumerator的句柄,如例8中所定义。

例8:

public interface class IEnumerator
{
  bool MoveNext();
  void Reset();
  property Object^ Current { Object^ get(); }
};

System::Array为一个集合类型,因为所有的CLI数组类型都继承自System::Array,所以,任何数组类型表达式都可以作为for each语句中的表达式。在例9的标号1中,for each用于遍历一个int数组,标号2中的处理过程也一样,但直接使用了枚举器。

例9:

using namespace System;
using namespace System::Collections;
int main()
{
  array<int>^ ary = gcnew array<int>{10, 20, 30, 40};
  /*1*/ for each (int i in ary)
  {
   Console::Write(" {0}", i);
  }
  Console::WriteLine();
  /*2*/ IEnumerator^ ie = ary->GetEnumerator();
  while (ie->MoveNext())
  {
   Console::Write(" {0}", static_cast<int>(ie->Current));
  }
  Console::WriteLine();
}

泛型

就像函数能用一个或多个类型表示符来定义一样,类型也可以这样来定义。假如有这样一种情况,某种类型建模了一个"数组",其可使用下标来访问每个元素,这样的类型往往被称为"向量",实现一个向量之后,可以保存一组int、一组double、或一组用户自定义类型的元素。然而,正是因为每种类型实现的代码对类型中的元素来说,都是唯一的,因此,可使用泛型机制来定义一个向量类型,并创建特定类型的实例。例10就是这样的一个例子。

例10:

generic <typename T>
public ref class Vector
{
  int length;
  /*1*/ array<T>^ vector;
  public:
   property int Length
   {
    int get() { return length; }
    private:
     void set(int value) { length = value; }
   }
   /*2*/ property T default[int]
   {
    T get(int index) { return vector[index]; }
    void set(int index, T value) { vector[index] = value; }
   }
   Vector(int vectorLength, T initValue)
   {
    Length = vectorLength;
    vector = gcnew array<T>(Length);
    for (int i = 0; i < Length; ++i)
    {
     /*3*/ this[i] = initValue;
    }
    /*4*/ //for each (T element in vector)
    //{
     // element = initValue;
    //}
   }
   Vector(int vectorLength)
   {
    Length = vectorLength;
    vector = gcnew array&l

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