Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Стандартные интерфейсы. Клонирование.Итераторы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
123.39 Кб
Скачать

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

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} \t сила = {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;

}

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

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();

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

Mas_Monster m = new Mas_Monster();

m.Add(new Monster(10, 10, "Вася"));

m.Add(new Daemon (10, 10, "Вася", 5));

foreach (Monster x in m)

x.Passport();

Console.ReadKey(); } }}

В данном примере на каждом шаге оператора foreach (Monster x in m) для итератора создается оболочка – временный объект, который запоминает текущее состояние итератора и выполняет необходимые действия для доступа к просматриваемым элементам объекта. Другими словами код итератора не выполняется как последовательность операторов, а разбит на отдельные шаги (итерации), между которыми состояние итератора сохранятеся.