Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Интерфейсы, делегаты, события в C#
Реализация методов интерфейса как виртуальных
using System; namespace Test { // Объявление интерфейса interface IDraw { void Show(); } // Реализуем интерфейсный метод как виртуальный class A : IDraw { string name = "Класс A"; public virtual void Show() { Console.WriteLine("\t" + name); } } // Переопределяет унаследованный виртуальный метод class B : A { string name = "Класс B"; public override void Show() { Console.WriteLine("\t" + name); } } // Вызывающая сторона class MyClass { public MyClass() { Console.WriteLine("Адресация ссылками типов объектов:"); A a = new A(); a.Show(); B b = new B(); b.Show(); Console.WriteLine("\nАдресация ссылкой типа унаследованного интерфейса\n" + "(динамический полиморфизм):"); IDraw refInterface = new A(); refInterface.Show(); refInterface = new B(); refInterface.Show(); } } // Запуск class Program { static void Main() { // Настройка консоли Console.Title = "Производить объекты абстрактных классов запрещено"; Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; Console.WindowWidth = 60; Console.WindowHeight = 10; new MyClass();// Чтобы сработал конструктор Console.ReadLine(); } } }
Применение библиотечных интерфейсов
В библиотеке .NET Framework объявлено множество интерфейсов, применение некоторых из них мы здесь проиллюстрируем.
Создание индексаторов и нумераторов
Пусть некоторый класс содержит коллекцию однотипных элементов, которые нужно перебрать с помощью цикла foreach. Такие коллекции называются нумераторами. В этом случае класс должен реализовать интерфейсы System.Collections.IEnumerable и System .Collections.IEnumerator, расположенные в сборке mscorlib.
В интерфейсе IEnumerable объявлен единственный метод
который возвращает ссылку на сам объект коллекции. Его в реализующем классе нужно определять так
public IEnumerator GetEnumerator() { // Приводим ссылку на объект к интерфейсному типу // и возвращаем адрес экземпляра класса return (IEnumerator)this; }Листинг 10.5 . Определение члена интерфейса IEnumerable в реализующем классе
Интерфейс IEnumerator содержит одно свойство и два метода, приведенные в таблице
Создание индексаторов
Пусть мы создали пользовательский класс Person с данными сотрудника и класс Persons, который будет содержать массив объектов класса Person с данными сотрудников. Для того, чтобы можно было обращаться в классе Persons к отдельным объектам-элементам массива, характеризующим отдельных сотрудников, нужно в нем предусмотреть индексатор. Обрабатывать отдельных сотрудников внутри класса Persons можно только как элементы массива. Вот код этого примера
using System; namespace Test { class Person { // Закрытые поля с данными сотрудника string name; // Имя int age; // Возраст // Конструктор по умолчанию public Person() { name = "Петров"; age = 21; } // Конструктор с параметрами public Person(string name, int age) { this.name = name; this.age = age; } // Свойства чтения/записи public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } } class Persons { // Объявляем закрытую ссылку-поле на массив сотрудников private Person[] personArray; // Конструктор public Persons() { personArray = new Person[]{ new Person("Иванов",20), new Person(),// По умолчанию Person("Петров", 21) new Person("Сидоров", 22) }; } // Свойство-индексатор public Person this[int index] { get { if (index < 0) return personArray[0]; else if (index > personArray.Length - 1) return personArray[personArray.Length - 1]; else return personArray[index]; } set { if (index < 0) personArray[0] = value; else if (index > personArray.Length - 1) personArray[personArray.Length - 1] = value; else personArray[index] = value; } } // Количество сотрудников public int Length { get { return personArray.Length; } } } // Вызывающая сторона class MyClass { public MyClass() { // Создаем список сотрудников Persons pers = new Persons(); // Выводим информацию о сотрудниках по индексатору Console.WriteLine("Список сотрудников:"); for (int i = 0; i < pers.Length; i++) Console.WriteLine("{2}) {0}, возраст {1}", pers[i].Name, pers[i].Age, i + 1); /* Нужно реализовать интерфейсы IEnumerable, IEnumerator Console.WriteLine("\nЕще один список сотрудников:"); int j = 0; foreach (Person per in pers) Console.WriteLine("{2}) {0}, возраст {1}", per.Name, per.Age, j = j + 1); //*/ } } // Запуск class Program { static void Main() { // Настройка консоли Console.Title = "Применение индексаторов"; Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; Console.WindowWidth = 30; Console.WindowHeight = 10; new MyClass();// Чтобы сработал конструктор Console.ReadLine(); } } }Листинг 10.6 . Класс Persons как индексный массив объектов Person