Классы коллекций общего назначения
Класс | Описание | Реализуемые интерфейсы |
ArrayList | Динамически изменяемый по размерам массив объектов любого типа | ICollection, IEnumerable, IEnumerator, IList, ICloneable |
HashTable | Коллекция объектов, идентифицируемая по числовому ключу | ICollection, IDictionary, ICloneable, IEnumerable |
Queue | Стандартная очередь или последовательный список (то есть каждый объект обрабатывается по порядку) | ICollection, IEnumerable, ICloneable |
Stack | Стек, обеспечивающий функциональные возможности стека: добавление в стек Push(…), извлечение Pop(…). | ICollection, IEnumerable, ICloneable |
Итак, типы пространства имён System.Collections используют общие функциональные возможности. В этом и заключается суть программирования на основе интерфейсов. При реализации одного и того же интерфейса в разных классах мы получаем возможность обращаться одинаково с различными типами объектов. Такой механизм называется интерфейсным полиморфизмом.
Динамическая идентификация типов. Проверка типа с помощью ключевого слова is. Использование операторов as, typeof.
Принципы обобщённого программирования (абстрагирование и иерархия) были рассмотрены при изучении интерфейсов и коллекций. Динамическая идентификация типов позволяет распознать тип данных во время работы программы. Она используется при работе с массивом объектов базового класса, а так же для проверки удачно ли выполнена операция «приведение к типу». Динамическая идентификация типов является ключевым компонентом средства – отражение (предоставление информации о типе).
В C# динамическую идентификацию типов поддерживают три ключевых слова: is, as, typeof.
Проверка типа с помощью ключевого слова – is (является ли)
С помощью is можно определить: имеет ли рассматриваемый объект заданный тип. Общая форма его записи:
Выражение isТип.
Тип выражения сравнивается с указанным типом и возвращается trueили false.
Задание: В проекте Планиметрия объявить объекты класса Point и Otrezok, распознать типы с помощью ключевого слова is.
//В Main():
Point T1 = new Point(-28,39);
Point T2 = new Point(2, 5);
Otrezok Otr1 = new Otrezok(T1,T2);
///Напишем логическое выражение:
//1)
if (T1 is Point)
Console.WriteLine("Объект Т1 имеет тип Point");
//Выполнить!
//2)
if (Otr1 is Point)
Console.WriteLine("Объект Otr1 совместим с типом Point");
//Выполнить!
// Получим true, так как отрезок наследуется от класса Point, т.е совместим с ним.
//3)
if (T1 is Otrezok)
Console.WriteLine("Объект T1 совместим с типом Otrezok");
//Выполнить!
//Получим false, ведь класс Point не наследуется от класса Otrezok.
//4)
if (T2 is Object)
Console.WriteLine("T2 - это объект");
//Выполнить!
4.2. Использование оператораas (как)
Иногда во время работы программы требуется выполнить операцию приведения типов (явное приведение), не генерируя исключения в случае, если попытка будет неудачной. Для этого предусмотрен оператор as.
Общая форма его записи:
Выражение as Тип.
В отличие от слова is, если операция прошла успешна, то возвращается ссылка на указанный тип, а иначе возвращается null-ссылка. Оператор as – альтернатива слову is.
Задание: Проверить, можно ли объект T1 использовать как отрезок.
//В Main():
if (T1 as Otrezok != null)
Otr1 = (Otrezok)T1;
else Otr1 = null;
if (Otr1 == null)
Console.WriteLine("Приведение типов не разрешено!");
else
Console.WriteLine("Приведение типов разрешено!");
//Выполнить!
Использование оператора typeof
Иногда нужно получить информацию о типе данных. Для таких случаев в C# предусмотрен оператор typeof (Тип). Он использует класс System.Type для получения данных об указанном типе.
Задание: В проекте Планиметрия получить полное имя типа заданного класса SteamReader (класс для создания входного потока символов, текстового файла).
//В Main():
//Объявим объект класса Type:
Type Ob = typeof(StreamReader);
Console.WriteLine("Полное имя типа " + Ob.FullName);
//Выполнить!
if (Ob.IsClass)
Console.WriteLine("Это - класс!");
else
Console.WriteLine("Это - не класс");
//Выполнить!
if (Ob.IsAbstract)
Console.WriteLine("Это - абстрактный класс!");
else
Console.WriteLine("Это - конкретный класс!");
//Выполнить!
Задание: Аналогично получить информацию о своём классе Otrezok.
Type ob = typeof(Otrezok);
Console.WriteLine("Полное имя типа " + ob.FullName);
//Выполнить!
if (ob.IsClass)
Console.WriteLine("Это - класс!");
else
Console.WriteLine("Это - не класс");
//Выполнить!
if (ob.IsAbstract)
Console.WriteLine("Это - абстрактный класс!");
else
Console.WriteLine("Это - конкретный класс!");
//Выполнить!