|
|
| using namespace System; public interface class ICollection { void Put(Object^ o); //隐式public abstract Object^ Get(); //隐式public abstract }; |
| interface class I1 { /* ... */ }; interface class I2 : I1 { /* ... */ }; interface class I3 : I1, I2 { /* ... */ }; |
| 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()); } |

