Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1446 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 10:

Интерфейсы, делегаты, события в C#

Создание нумераторов

Если для перебора внутренних элементов объекта Persons мы попробуем воспользоваться циклом foreach (закомментирован в конструкторе MyClass() ), то получим сообщение об ошибке. Реализация классом Persons интерфейсов IEnumerable и IEnumerator позволяет превратить экземпляр этого класса в коллекцию. Только нужно не забыть присоединить к файлу пространство имен System.Collections, где находятся эти интерфейсы.

using System;
using System.Collections;
    
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 : IEnumerable, IEnumerator 
    {
        // Реализация IEnumerable
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }
    
        // Реализация IEnumerator
        int pos = -1;   // Текущая позиция элемента в массиве
    
        public bool MoveNext()
        {
            if (pos < personArray.Length - 1)
            {
                pos++;
                return true;
            }
            else
                return false;
        }
    
        public void Reset() { pos = -1; }
    
        public object Current
        {
            get { return personArray[pos]; }
        }
    
        // Объявляем ссылку-поле на массив сотрудников
        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.7 . Класс Persons как коллекция объектов Person

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?