Сравнение объектов
Итак, мы подробно рассмотрели копирование объектов. Теперь рассмотрим сравнение объектов. Для сравнения объектов в .NET Framework используется интерфейс IComparable. В этом разделе мы в качестве примера воспользуемся интерфейсом IComparablе для сортировки массива.
Сортировка массива
В классе System::Array (Система::Массив) статический метод Sort (Сортировка) предназначен для сортировки массива. Программа ArrayName иллюстрирует применение этого метода к сортировке массива объектов Name (Имя), где класс Name (Имя) содержит просто строку. Приведем листинг основной программы:
//ArrayName.срр _gc class ArrayName // класс сборщика мусора ArrayName { public: static void Main() { Name *array[] = new Name*[5]; // Имя array[0] = new Name("Michael"); // новое Имя ("Майкл") array[1] = new Name("Charlie"); // новое Имя ("Чарли") array[2] = new Name("Peter"); // новое Имя ("Питер") array[3] = new Name("Dana"); // новое Имя ("Дана") array[4] = new Name("Bob"); // новое Имя ("Боб") if (dynamic_cast<IComparable *>(array[0])!= 0) Array::Sort(array); else Console::WriteLine( "Name does not implement IComparable"); // (" Name (Имя) не реализует IComparable"); lEnumerator *pEnum = array › GetEnumerator(); while (pEnum › MoveNext()) { Name *pName = // Имя dynamic_cast<Name *>(pEnum › Current); if (pName!= 0) Console::WriteLine(pName); } } };
Реализация IComparable
Для того чтобы можно было произвести сортировку, необходимо определить правила сравнения сортируемых объектов. Такие правила реализуются в методе CompareTo интерфейса IComparable. Поэтому, для того, чтобы иметь возможность сортировать массивы, содержащие данные определенного вами типа, необходимо реализовать интерфейс IComparable для этого типа данных.
_gc _interface IComparable // сборщик мусора – IComparable { int CompareTo(Object* obj); };
Приведем листинг реализации класса Name (Имя), включая и реализацию интерфейса IComparable:
_gc class Name: public IComparable { private: // частный String *pText; public: Name(String *pText) // Имя { this › pText = pText; } _property String* get_Item() { return pText; } _property void set_Itern(String* pText) { this › pText = pText; } int CompareTo(Object *pOb]) // Объект { String *pSl = this › pText; String *pS2 = (dynamic_cast<Name *>(pObj)) › pText; return String::Compare(pSl, pS2); // сравниваются имена } String *ToString() { return pText; } };
Результатом работы программы является упорядоченный по алфавиту список имен:
Bob // Боб Charlie // Чарли Dana // Дана Michael // Майкл Peter // Питер