Для проверки нового кода в конец функции Main добавьте следующие строки:
m = new Man ("Avalon Ru", 10); // Используем второй конструктор
m.Out(); m.In(); m.Out();
Следующее (необязательное) задание лучше выполнить дома (в аудитории время слишком ценно). Создайте свой собственный класс и испытайте его поведение. Например, класс плоских многоугольников (Данные: количество вершин, массив координат. Методы: ввести, вывести, переместить, вычислить площадь, определить выпуклый или нет, создать выпуклую оболочку, определить, лежит ли заданная точка внутри, и т.д.)
Смотрите, как просто создать динамическую коллекцию, работающую по принципу стека на основе линейного односвязного списка, реализованного буквально на лету. Этот пример приводит создатель языка Anders Hejlsberg. Добавьте к проекту новый класс с именем Stack (при этом студия создаст файл Stack.cs) и вставьте (внутрь пространства имен) такой код:
public class Stack
{
#region Class Node (Поставьте фокус сюда и нажмите Ctrl+MM несколько раз)
class Node
{
public Node Next;
public object Value;
public Node(object value): this(value, null) {} // Вызов другого конструктора
public Node(object value, Node next)
{
Next = next;
Value = value;
}
}
#endregion
Node top = null; // Вершина стека
public bool IsEmpty() { return top == null; }
public void Push(object o) { top = new Node (o, top); }
public object Pop()
{
if (top == null)
throw new Exception ("Can't Pop from an empty Stack");
else
{
object pop = top.Value;
top = top.Next;
return pop;
}
}
}
Теперь методом копирования добавьте в класс Program метод TestStack, и проверьте работу коллекции.
static void TestStack()
{
Console.Clear();
Console.WriteLine("Test Stack\n");
Stack stack = new Stack();
stack.Push(new Man("Alex Black", 30));
stack.Push(new Man("Jane Fonda", 28));
stack.Push(new Man("Peter Norton", 36));
stack.Push("One");
stack.Push("Two");
stack.Push(new Exception("This is an exception object"));
stack.Push(DateTime.Now);
stack.Push(Math.PI);
stack.Push(Math.E);
Console.WriteLine("\nMy Stack had\n");
while (!stack.IsEmpty())
Console.WriteLine(stack.Pop());
Console.WriteLine("\n\t\tPress any key to go to main menu\n");
Console.ReadKey(true);
}
При тестировании созданных нами модулей, обнаруживаются слабые места. Запустите проект в режиме отладки (F5) и убедитесь, что при вводе возраста человека, система выбрасывает исключение, если вместо ожидаемых цифр, ввести другие символы. Исключение имеет вид диалога, в котором приведено (на мой взгляд, исчерпывающее) объяснение причины.
Input string was not in a correct format.
При запуске в нормальном режиме (Ctrl+F5) и нажатии кнопки Close, текстовое сообщение, объясняющее причину ошибки, будет выведено в консольное окно.
Зададимся целью самостоятельно обработать исключение, вызываемое погрешностями ввода числовой информации. Для этого создадим две вспомогательные функции, одна из которых (MakeInt) будет следить за вводом, а другая (AskInt) позволит зациклить запрос с целью добиться корректного ввода. Эти функции носят общий характер, поэтому их надо сделать доступными для всех классов нашего пространства имен MyConsole.
В C# отсутствует понятие глобальных сущностей. Здесь все функции и данные должны быть инкапсулированы в классы. Если функция или элемент данных имеют общий характер, то есть для их использования не требуется предварительно создавать и инициализировать объекты каких-то известных классов, то ваш выбор должен пасть на члены класса типа static. Из курса ООП вы, вероятно, знаете, что static–данные являются общими для всех объектов класса и хранятся в единственном экземпляре. Вы также знаете, что static–функции могут (а теперь и должны) вызываться по имени класса. Значит, для их вызова не нужно предварительно создавать объект класса. Таким образом, static-данные (в новых условиях) — это аналоги глобальных данных.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.