在标号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(); } |

