泛型
就像函数能用一个或多个类型表示符来定义一样,类型也可以这样来定义。假如有这样一种情况,某种类型建模了一个"数组",其可使用下标来访问每个元素,这样的类型往往被称为"向量",实现一个向量之后,可以保存一组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<T>(Length); for (int i = 0; i < Length; ++i) { /*5*/ this[i] = T(); } } Vector() { Length = 0; /*6*/ vector = gcnew array<T>(0); } ~Vector() //多余的 { /*7*/ vector = nullptr; } virtual String^ ToString() override { String^ s = "["; int i; for (i = 0; i < Length - 1; ++i) { /*8*/ s = String::Concat(s, this[i], ":"); } /*9*/ s = String::Concat(s, this[i], "]"); return s; } virtual bool Equals(Object^ obj) override { if (obj == nullptr) { return false; } if (this == obj) //在测试自身吗? { return true; } /*10*/ if (GetType() == obj->GetType()) { Vector<T>^ v = static_cast<Vector^>(obj); if (Length != v->Length) //是否向量有不同的长度? { return false; } for (int i = 0; i < Length; ++i) { /*11*/ //if (this[i] != v[i]) if (this[i]->Equals(v[i]) == false) { return false; } } return true; } return false; } /*12*/ virtual int GetHashCode() override { return 0; } }; |

