Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 29

Console.WriteLine(" sl[\"BitArray\"] = {0}\n\n", sl["BitArray"]);    // Демонстрируем выбор по ключу

for (int i = 0;  i < sl.Count;  i++)  // Выбор по индексу

Console.WriteLine (" {0}: {1}", sl.GetKey(i).ToString().PadRight(15),sl.GetByIndex(i));

Вывод подтверждает факт упорядоченности коллекции по ключевому полю. Если в качестве ключевого поля выступает сложный объект, то, как вы, наверное, догадались, правила игры задает интерфейс IComparable и его метод CompareTo. Сортировка идет с учетом возвращаемого этим методом результата сравнения двух объектов. С другими типами динамических коллекций объектов: BitArray, Queue и Stack вы познакомитесь с помощью MSDN. Они очень просты в обращении.

Задание. Создайте сортированный список SortedList пар (Man, string). В качестве string выберите профессию или номер телефона. Для того, чтобы увидеть влияние метода CompareTo и статического свойства Man.SortBy измените порядок сортировки. Отметьте, что это надо сделать до вставки пар в коллекцию. После образования коллекции пересортировать ее уже невозможно.

Особенности наследования в C#

В книгах, посвященных изучению основ ООП и языка С++, установилась традиция иллюстрировать реализацию главных идей и концепций ООП (механизм наследования и полиморфизм позднего связывания) на примере динамического списка родственных объектов (принадлежащих одной иерархии классов). Управление таким списком позволяет наглядно продемонстрировать мощь основного оружия ООП.

В C# множественное наследование не поддерживается, поэтому класс не может иметь более одного родителя, но он может наследовать данные и методы одного класса и реализовывать (путем наследования) методы произвольного количества интерфейсов.

В динамическом списке, который мы собираемся создать, будут храниться адреса (в С#, вместо них используются ссылки) любых объектов из предварительно созданного иерархического дерева классов. Все они управляются с помощью указателя (в С# ссылки), который имеет тип самого верхнего класса иерахии. Для отражения этого факта обычно используют мнемоническое правило: «Родители могут указывать на детей».

Когда родительский перст (указатель) падает на одного из своих потомков, приказывая ему выполнить одно из общих для всех классов действий, то выбор способа выполнения этого действия происходит поздно (на этапе выполнения). Каждый ребенок выполняет его по-своему. Например, при указании: «Введи свои данные из файла», каждый объект выбирает свой собственный способ (тело виртуальной функции). При этом он, правда, может попросить родителя вывести те данные, которые унаследованы от него, и этот факт обозначается как вызов родительской версии виртуальной функции.

Для иллюстрации механизма наследования мы сделаем существующий класс Man абстрактным, но при этом создадим два новых класса Stud и Prof, которые будут произведены от него. Приняв такое решение, мы тем самым заявляем, что реальными объектами, ссылки на которые будут храниться в коллекции, могут быть только представители классов Stud и Prof. Абстрактный же класс Man служит лишь для создания иерархии классов: «Люди, различаемые по статусу или профессиональному признаку».

При желании вы можете развить иерархию классов, добавив другие (производные от Man) классы: Worker, Salesman и т.д. Здесь важен тот факт, что все эти реальные, не абстрактные классы будут иметь свои собственные версии виртуальных функций (действий общего характера), которые были объявлены в родительском классе Man.

Задание

Создайте гетерогенный (разнородный) список объектов классов Stud и Prof. Пусть студент добавит поле данных int course, а профессор — int pubs; (кол-во публикаций). Продемонстрируйте работу полиморфизма позднего связывания при управлении списком. Первый шаг: сделайте класс Man абстрактным.

public abstract class Man : IComparable