Создание сравнимых объектов (IComparable)

Создание сравнимых объектов (IComparable)

Интерфейс System.IComparable определяет поведение, позволяющее сортировать объекты по заданному ключу. Вот формальное определение.

// Этот интерфейс позволяет объекту указать его связь

// с другими подобными объектами.

public interface IComparable {

 int CompareTo(object o);

}

Предположим теперь, что класс Car поддерживает некоторый внутренний идентификатор (представленный целым числом, хранимым в переменной carID), значение которого можно устанавливать с помощью параметра конструктора и изменять с помощью нового свойства ID. Ниже показана соответствующая модификация типа Car.

public class Car {

 …

 private int carID;

 public int ID {

  get { return carID; }

  set { carID = value; }

 }

 public Car(string name, int currSp, int id) {

  currSpeed = currSp;

  petName = name;

  carID = id;

 }

 …

}

Пользователи объекта могут создать массив типов Car так.

static void Main(string[] args) {

 // Создание массива типов Car.

 Car[] myAutos = new Car[5];

 myAutos[0] = new Car("Rusty", 80, 1);

 myAutos[1] = new Car("Mary", 40, 234);

 myAutos[2] = new Car("Viper", 40, 34);

 myAutos[3] = new Car("Mel", 40, 4);

 myAutos[4] = new Car("Chucky", 40, 5);

}

Вспомним, что класс System.Array определяет статический метод Sort(). Вызвав этот метод для массива встроенных типов (int, short, string и т.д.), можно отсортировать элементы в массиве в числовом или алфавитном порядке, поскольку встроенные типы данных реализуют IComparable. Но что произойдет в том случае, когда методу Sort() будет передан массив типов Car, как показано ниже?

// Будут ли отсортированы мои автомобили?

Array.Sort(myAutos);

Запустив этот пример, вы обнаружите, что среда выполнения сгенерирует исключение ArgumentException c сообщением следующего содержания: "Как минимум один объект должен реализовать IComparable". Чтобы позволить сортировку массивов ваших пользовательских типов, вы должны реализовать IComparable. При создании CompareTo() вы должны решить, что должно лежать в основе соответствующей операции упорядочения. Для типа Car самым подходящим "кандидатом" является carID.

// Последовательность Car можно упорядочить на основе CarID.

public class Car: IComparable {

 …

 // Реализация IComparable.

 int IComparable.CompareTo(object obj) {

  Car temp = (Car)obj;

  if (this.carID › temp.carID) return 1;

  if(this.carID temp.carID) return -1;

  else return 0;

 }

}

Как видите, в CompareTo() выполняется сравнение поступившего типа с текущим экземпляром на основе сравнения значений заданных элементов данных. Возвращаемое значение CompareTo() указывает, будет ли данный тип меньше, больше или равен объекту сравнения (см. табл. 7.1).

Таблица 7.1. Возвращаемые значения CompareTo()

Возвращаемое значение Описание
Любое число, меньшее нуля В данном порядке сортировки текущий экземпляр размещается до указанного объекта
Нуль Этот экземпляр равен указанному объекту
Любое число, большее нуля В данном порядке сортировки текущий экземпляр размещается после указанного объекта 

Теперь, когда тип Car "умеет" сравнивать себя с подобными объектами, вы можете записать пользовательский программный код следующего вида.

// Проверка интерфейса IComparable.

static void Main(string[] args) {

 // Создание массива типов Car.

 // Вывод исходного массива.

 Console.WriteLine("Несортированный набор машин:");

 foreach(Car с in myAutos) Console.WriteLine("{0) (1}", с.ID, с.petName);

 // Теперь сортируем их с помощью IComparable.

 Array.Sort(myAutos);

 // Вывод отсортированного массива.

 Console.WriteLine(" Упорядоченный набор машин:");

 foreach(Car с in myAutos) Console.WriteLine("{0} {1}", с.ID, с.petName);

 Console.ReadLine();

}

На рис. 7.10 показан соответствующий вывод.

Рис. 7.10. Сравнение автомобилей на основе значений ID

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Создание объектов, предусматривающих финализацию

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Создание объектов, предусматривающих финализацию В главе 3 говорилось о том, что главный базовый класс .NET, System.Object, определяет виртуальный метод с именем Finalize() (метод деструктора). Реализация этого метода, заданная по умолчанию, не делает ничего.// System.Objectpublic class Object


Создание клонируемых объектов (ICloneable)

Из книги 3ds Max 2008 автора Верстак Владимир Антонович

Создание клонируемых объектов (ICloneable) Вы, должно быть, помните из главы 3, что System.Object определяет член с именем MemberwiseClone(). Указанный метод используется для получения поверхностной копии объекта. Пользователи объекта не могут вызвать этот метод непосредственно (поскольку


Создание объектов сцены

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

Создание объектов сцены В данном разделе будут рассмотрены основы создания объектов. Речь пойдет о простых объектах, однако применяемые для них правила такие же, как и для большинства сложных объектов. Кроме того, примитивы часто используются в качестве «строительных


Создание составных объектов

Из книги AutoCAD 2009. Начали! автора Соколова Татьяна Юрьевна

Создание составных объектов Составные объекты (Compound Objects) в 3ds Max 2008 представлены отдельной группой категории Geometry (Геометрия) вкладки Create (Создание) командной панели. Как правило, это тела, состоящие из двух и более простых объектов, рассмотренных выше (трехмерных объектов


Создание подобных объектов

Из книги AutoCAD 2010 автора Орлов Андрей Александрович

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


Создание подобных объектов

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


Создание зеркальной копии объектов

Из книги VBA для чайников автора Каммингс Стив

Создание зеркальной копии объектов Команда MIRROR создает зеркальное (симметричное) отражение объектов относительно оси симметрии, определенной двумя выбранными крайними точками.После запуска команды MIRROR AutoCAD выдаст приглашение:Select objects:Выберите объекты, которые вы


Создание объектов

Из книги 3ds Max 2008 на 100 % автора Верстак Владимир Антонович

Создание объектов Мы рассмотрели базовые операции размещения новых объектов. Простейший способ размещения записывается какcreate xи его эффект был определен триадой: создать новый объект; связать его со ссылкой x; и инициализировать его поля.Вариант этой инструкции


2.2. Создание объектов сцены

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

2.2. Создание объектов сцены В данном разделе главы будут рассмотрены основы создания объектов. Речь пойдет о простых объектах, однако применяемые для них правила такие же, как и для большинства сложных объектов. Кроме того, примитивы часто используются в качестве


Создание подобных объектов

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


Создание подобных объектов

Из книги Написание скриптов для Blender 2.49 автора Anders Michel

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


7.1. Создание блоковых объектов

Из книги автора

7.1. Создание блоковых объектов Постановка задачи Необходимо иметь возможность писать собственные блоковые объекты либо использовать блоковые объекты с классами из iOS


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

Из книги автора

2 Создание и редактирование объектов В некотором смысле, меши - наиболее важный тип объектов в 3D-приложении. Они лежат в основе большинства видимых объектов и являются сырьём, которое может быть оснащено (rigged) и анимировано в дальнейшем. В этой главе речь идет о создании