|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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
