Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Дейтсвие - описать ИТЕРАТОР!!!




Итератор – блок кода программы, задающий последовательность перебора элементов объекта. На каждом проходе цикла foreach выполняется один шаг итератора, заканчивающийся выдачей очередного значения с помощью ключевого слова yield.

Перебор элементов (интерфейс IEnumerable) и итераторы

Оператор foreach является удобным средством для перебора эелемнтов объекта. Массивы и все коллекции позволяют выполнять такой перебор благодаря тому, что в них реализованы интерфейсы IEnumerable и IEnumerator. Для применения оператора foreach к собсвенному типу данных требуется реализовать в нем эти итераторы.

Интерфейс IEnumerable (перечислимый) определяет единственный метод GetEnumerator(), возвращающий объект типа IEnumerator (перечислитель), который можно использовать для просмотра элементов объекта.

Интерфейс IEnumerator задает три элемента:

  • Свойство Current, возвращающее текущий элемент объекта
  • Метод MoveNext() продвигающий перечислитель на следующий элемент объекта
  • Метод Reset() устанавливающий перечислитель в начало просмотра.

Цикл foreach использует эти методы для перебора элементов, из которых состоит объект.

Таким образом, для того, чтобы применить цикл foreach необходимо реализовать четыре метода GetEnumerator(), Current, MoveNext() и Reset().

Например, если элементы класса организованы как массив, необходимо описать закрытое поле класса, хранящее текущий индекс в массиве, в методе MoveNext() задать изменение этого индекса на 1 и проверку выхода за границу массива, а в свойстве Current – возврат элемента массива по текущему индексу.

В языке С# имеются стандартные средства, обеспечивающие аналогичные действия, которые выполняют перебор элементов в объекте – итераторы.

Пример работы класса с итератором

using System;

using System.Collections;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Monster

{

public Monster(int сила, int умение, string имя)

{

this.сила = сила;

this.умение = умение;

this.имя = имя;

}

public virtual void Passport()

{

Console.WriteLine("Монстр {0} сила = {1} умение= {2}", имя, сила, умение);

}

public int Сила

{

get

{

return сила;

}

set

{

if (value > 0) сила = value;

else сила = 0;

}

}

public int Умение

{

get

{

return умение;

}

set

{

if (value > 0) умение = value;

else умение = 0;

}

}

public string Имя

{

get

{

return имя;

}

}

 

string имя;

int сила, умение;

}

//производный класс от монстра – демон, умеющий “думать”

class Daemon: Monster

{

public Daemon(int сила, int умение, string имя, int ум)

: base(сила, умение, имя)

{ this.ум = ум; }

public override void Passport()

{

Console.WriteLine("Демон {0} сила = {1} умение {2} ум = {3}", Имя, Сила, Умение, ум);

}

public void Think()

{

Console.Write(Имя + "это ");

for (int i = 0; i < ум; i++) Console.Write(" думает ");

Console.WriteLine("...");

}

int ум;

}

class Mas_Monster: IEnumerable //1 дейтсвие –класс реализует интерфейс IEnumerable

{

Monster[] mas;

int n;

public Mas_Monster()

{

mas = new Monster[10];

n = 0;

}

public IEnumerator GetEnumerator()

{

for (int i = 0; i < n; i++) yield return mas[i]; //ЭТО- ИТЕРАТОР!!!

}

public void Add(Monster m)

{

if (n >= 10) return;

mas[n] = m;

n++;

}

}

 

class Program

{

static void Main(string[] args)

{

//демонстрация работы с производным классом

Daemon D = new Daemon(50, 50, "Дима", 3);

D.Passport();

D.Think();




Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 1210; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.