科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件实例解析C++/CLI中的接口与泛型

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

某些时候,让不相关的类分享一组公有成员,以便产生相同的行为,是非常有用的。

作者:谢启东编译 来源:天极开发 2007年11月12日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
接口不提供多重继承,与此相比,一个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一个指向任意对象的句柄,只要它的类实现了这个接口,或者它是从实现了这个接口的类继承而来的。

  例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();
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章