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

      // Ваш код. Не забудьте про защиту от неправильных значений id

    }

  }

}

}

Класс List готов. При выбранной тактике управления списком функция Main выглядит просто.

  (new List()).Work();

Уверен, что каждый программист, даже не очень опытный, имеет свое собственное мнение относительно важности или неважности тех или иных деталей реализации. Одни ценят компактность кода, другие — читабельность, третьи — только свой индивидуальный стиль. Но все должны считаться с такой характеристикой кода, как надежность. Надеюсь, что разработанный нами код достаточно надежен для учебного приложения по теме «Динамичские гетерогенные списки», хотя он абсолютно не работоспособен в настоящем состоянии.

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

Создайте (путем копирования и переименования) класс Prof (производный от Man). Этот класс принадлежит той же мини-иерархии и использует те же методы, что и первый, поэтому не нуждается в комментарии. В настоящий момент вы почти готовы к тому, чтобы реализовать функционирование динамического гетерогенного списка, который использует полиморфизм позднего связывания.

При выполнении действий общего характера (In(), Read(), Class()) полиморфизм осуществляет индивидуальный подход к каждому объекту путем выбора конкретной версии виртуального метода. Каждый объект из иерархии классов Man имеет таблицу указателей vtable. Выбор адреса из таблицы осуществляется поздно (на этапе выполнения). Он делается на основе типа объекта, на который имеется ссылка. Сама ссылка имеет тип Man, но она ссылается на объект одного из производных классов (Stud или Prof).

Тип действия задает пользователь, выбирая команды из меню, которое мы должны в определенные моменты показывать на экране. В консольном варианте функциональность меню может выполнять комбинация команд: вывода строк текста с возможными альтернативами, и ввода строки, которая интерпретируется как выбор пользователя. Следующий фрагмент реализует функцию главного меню.

public char Menu()

{

Console.Write("\n" + // Меню выбора действия

  "\n\t\tq - Quit\n\t\ts - Show\n\t\ta - Add\n\t\td - Delete" +

  "\n\t\tt - Sort\n\t\tr - Read\n\t\tw - Write\n\n");

return Console.ReadLine().ToLower()[0];      // Читаем строку текста и выделяем первый символ

}

Для записи данных в других форматах прочтите следующий параграф. Разработайте недостающий код и добейтесь правильной работы списка.

Другие способы хранения данных

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

·  void Serialize (Stream, object)

·  object Deserialize (Stream)

которые автоматизируют процесс записи и чтения сериализуемых объектов на постоянный носитель. Для того, чтобы данные класса стали сериализуемыми, достаточно пометить весь класс атрибутом [Serializable]. Вставьте атрибуты перед объявлениями классов Man, Prof и Stud. Так как все коллекции .NET сериализуемы, то коллекция men типа ArrayList, состоящая из ссылок на сериализуемые объекты, автоматически становится сериализуемой. Испытайте следующие кодовые фрагменты, вставив их в подходящие места.

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

IFormatter fmt = new BinaryFormatter();

Stream stream = new FileStream ("../../List.bin", FileMode.Create);

fmt.Serialize (stream, men);

stream.Close();

После выполнения этого кода откройте файл List.bin в рамках студии (она сама подберет подходящий редактор — двоичный) и убедитесь, что все данные списка, необходимые для его восстановления, попали в файл. Для чтения двоичного файла можно использовать такой фрагмент: