StringComparison.OrdinalIgnoreCase);

      }

      else

      {

        throw new ArgumentException("Parameter is not a Car!");

                            // Параметр не является объектом типа Car!

      }

    }

  }

}

Вспомогательный класс PetNameComparer может быть задействован в коде. Класс System.Array содержит несколько перегруженных версий метода Sort, одна из которых принимает объект, реализующий интерфейс IComparer:

...

// Теперь сортировать по дружественному имени.

Array.Sort(myAutos, new PetNameComparer);

// Вывести отсортированный массив.

Console.WriteLine("Ordering by pet name:");

foreach(Car c in myAutos)

{

  Console.WriteLine("{0} {1}", c.CarID, c.PetName);

}

...

<p id="AutBody_Root346">Специальные свойства и специальные типы сортировки</p>

Важно отметить, что вы можете применять специальное статическое свойство, оказывая пользователю объекта помощь с сортировкой типов Car по специфичному элементу данных. Предположим, что в класс Car добавлено статическое свойство только для чтения по имени SortByPetName, которое возвращает экземпляр класса, реализующего интерфейс IComparer (в этом случае PetNameComparer; не забудьте импортировать пространство имен System.Collections):

// Теперь мы поддерживаем специальное свойство для возвращения

// корректного экземпляра, реализующего интерфейс IComparer.

public class Car : IComparable

{

...

  // Свойство, возвращающее PetNameComparer.

  public static IComparer SortByPetName

    => (IComparer)new PetNameComparer;}

Теперь в коде массив можно сортировать по дружественному имени, используя жестко ассоциированное свойство, а не автономный класс PetNameComparer:

// Сортировка по дружественному имени становится немного яснее.

Array.Sort(myAutos, Car.SortByPetName);

К настоящему моменту вы должны не только понимать способы определения и реализации собственных интерфейсов, но также оценить их полезность. Конечно, интерфейсы встречаются внутри каждого важного пространства имен .NET Core, а в оставшихся главах книги вы продолжите работать с разнообразными стандартными интерфейсами.

<p id="AutBody_Root347">Резюме</p>

Интерфейс может быть определен как именованная коллекция абстрактных членов. Интерфейс общепринято расценивать как поведение, которое может поддерживаться заданным типом. Когда два или больше число типов реализуют один и тот же интерфейс, каждый из них может трактоваться одинаковым образом (полиморфизм на основе интерфейсов), даже если типы определены в разных иерархиях.

Для определения новых интерфейсов в языке C# предусмотрено ключевое слово interface. Как было показано в главе, тип может поддерживать столько интерфейсов, сколько необходимо, и интерфейсы указываются в виде списка с разделителями-запятыми. Более того, разрешено создавать интерфейсы, которые являются производными от множества базовых интерфейсов.

В дополнение к построению специальных интерфейсов библиотеки .NET Core определяют набор стандартных (т.е. поставляемых вместе с платформой) интерфейсов. Вы видели, что можно создавать специальные типы, которые реализуют предопределенные интерфейсы с целью поддержки набора желательных возможностей, таких как клонирование, сортировка и перечисление.

<p id="AutBody_Root348">Глава 9</p><p>Время существования объектов</p>

К настоящему моменту вы уже умеете создавать специальные типы классов в С#. Теперь вы узнаете, каким образом исполняющая среда управляет размещенными экземплярами классов (т.е. объектами) посредством сборки мусора. Программистам на C# никогда не приходится непосредственно удалять управляемый объект из памяти (вспомните, что в языке C# даже нет ключевого слова наподобие delete). Взамен объекты .NET Core размещаются в области памяти, которая называется управляемой кучей, где они автоматически уничтожаются сборщиком мусора "в какой-то момент в будущем".

Перейти на страницу:

Похожие книги