它的类实现了这个接口,或者它是从实现了这个接口的类继承而来的。
例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
|