实例解析C++/CLI中的接口与泛型[VC/C++编程]
本文“实例解析C++/CLI中的接口与泛型[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
接口
某些时刻,让不相关的类分享一组公有成员,以便产生相同的行为,是非常有效的.一个最基本的办法大概是通过一个大众的基类来定义它们,但这种办法太受范围,因为它要求这些类通过担当而彼此关联,别的,它们大概还有着各自的基类,且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());
}
以上是“实例解析C++/CLI中的接口与泛型[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |