Architecture Net

       

Сравнение объектов


Итак, мы подробно рассмотрели копирование объектов. Теперь рассмотрим сравнение объектов. Для сравнения объектов в .NET Framework используется интерфейс ICompa-rable. В этом разделе мы в качестве примера воспользуемся интерфейсом ICompara-Ые для сортировки массива.

Сортировка массива

В классе 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[l] = 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 // Питер

CompEbook.ru Железо, дизайн, обучение и другие



Содержание раздела