Тверской государственный университет
Опубликован: 02.12.2009 | Доступ: свободный | Студентов: 2365 / 261 | Оценка: 4.47 / 4.24 | Длительность: 14:45:00
Лекция 9:

Универсальность. Классы с родовыми параметрами

Framework .Net и универсальность

Универсальность принадлежит к основным механизмам языка. Ее введение в язык C# не могло не сказаться на всех его основных свойствах. Как уже говорилось, классы и все частные случаи стали обладать этим свойством. Введение универсальности не должно было ухудшить уже достигнутые свойства языка - статический контроль типов, динамическое связывание и полиморфизм. Не должна была пострадать и эффективность выполнения программ, использующих универсальные классы.

Решение этих задач потребовало введения универсальности не только в язык C#, но и поддержки на уровне каркаса Framework .Net и языка IL, включающем теперь параметризованные типы. Универсальный класс C# не является шаблоном, на основе которого строится конкретизированный класс, компилируемый далее в класс (тип) IL. Компилятору языка C# нет необходимости создавать классы для каждой конкретизации типов универсального класса. Вместо этого происходит компиляция универсального класса C# в параметризованный тип IL. Когда же CLR занимается исполнением управляемого кода, то вся необходимая информация о конкретных типах извлекается из метаданных, сопровождающих объекты.

При этом дублирования кода не происходит и на уровне JIT-компиляторов, которые, однажды сгенерировав код для конкретного типа, сохраняют ссылку на этот участок кода и передают ее, когда такой код понадобится вторично. Это справедливо как для ссылочных, так и для значимых типов.

Естественно, что универсальность потребовала введения в библиотеку FCL соответствующих классов, интерфейсов, делегатов и методов классов, обладающих этим свойством.

Так, например, в класс System.Array добавлен ряд универсальных статических методов. Вот один из них:

public static int BinarySearch<T>(T[] array, T value);

В табл. 8.1 показаны некоторые универсальные классы и интерфейсы библиотеки FCL 2.0 из пространства имен System.Collections.Generic и их аналоги из пространства System.Collections.

Таблица 8.1. Соответствие между универсальными классами и их обычными двойниками
Универсальный класс Обычный класс Универсальный интерфейс Обычный интерфейс
Comparer<T> Comparer ICollection<T> ICollection
Dictionary<K,T> HashTable IComparable<T> IComparable
LinkedList<T> ---- IDictionary<K,T> IDictionary
List<T> ArrayList IEnumerable<T> IEnumerable
Queue<T> Queue IEnumerator<T> IEnumerator
SortedDictionary<K,T> SortedList IList<T> IList
Stack<T> Stack

Проекты

  1. Постройте DLL с классом Sorting, содержащим различные методы сортировки. Методы должны быть универсальными и позволять сортировать объекты разных типов - персоны, машины, числа, строки. Методы должны быть функциями высших порядков, допускающими сортировать данные типа T по разным критериям, например, сортировать машины по маркам, по номерам, по фамилиям владельцев. В Windows-проекте постройте классы Person, Car и другие классы, демонстрирующие работу с классом Sorting. В клиентском классе предусмотрите построение набора функций, позволяющих сравнивать персон по разным критериям. Предусмотрите возможность задания таких функций лямбда-выражениями. В интерфейсе проекта предусмотрите возможность сравнения методов сортировки по времени. Постройте метод, вычисляющий время сортировки, как функцию высшего порядка, которой передается в качестве аргумента метод сортировки.
  2. Постройте DLL, включающую собственные аналоги библиотечных классов Stack<T>, Queue<T>, List<T>. Постройте Windows-проект для работы с этими классами.
  3. Постройте DLL, включающую собственные аналоги библиотечных классов List<T>, LinkedList<T>. Постройте Windows-проект для работы с этими классами.
  4. Постройте DLL, включающую собственные аналоги библиотечных классов Dictionary<K, T>, SortedDictionary<K, T>. Постройте Windows-проект для работы с этими классами.
  5. Постройте DLL, включающую класс BinaryTreeSearch<K, T> - бинарное дерево поиска. Элементы, хранимые в дереве, обладают ключом типа K и информационным полем типа T. Ключи элементов уникальны. Для дерева поиска справедливо свойство: Ключ элемента, хранимого в корне дерева, больше ключей всех элементов, хранимых в левом поддереве, и меньше ключей всех элементов, хранимых в правом поддереве. Постройте Windows-проект для работы с этим классом.
  6. (**) Постройте DLL с классами, реализующими сбалансированные бинарные деревья поиска - идеально сбалансированные деревья, АВЛ - деревья, красно-черные деревья. Постройте Windows-проект для работы с этим классом. Проект должен позволять оценить время работы на одних и тех же данных при использовании разных типов деревьев.
Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Дарья Федотова
Дарья Федотова
Александр Мигунов
Александр Мигунов
Россия