
- •Стандартные интерфейсы. Клонирование. Итераторы Стандартные интерфейсы .Net
- •Сравнение объектов (интерфейс iComparable)
- •Пример использования стандартного интерфейса iComparable на примере класса Monster
- •Сортировка объектов по различным критериям (интерфейс iComparer)
- •Пример использования стандартного интерфейса iComparer на примере класса Monster
- •Int сила, умение;
- •Клонирование объектов (интерфейс iCloneable)
- •Int сила, умение;
- •Перебор элементов (интерфейс iEnumerable) и итераторы
- •Пример работы класса с итератором
- •Int сила, умение;
- •Примеры применения простейших итераторов
Пример работы класса с итератором
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) для итератора создается оболочка – временный объект, который запоминает текущее состояние итератора и выполняет необходимые действия для доступа к просматриваемым элементам объекта. Другими словами код итератора не выполняется как последовательность операторов, а разбит на отдельные шаги (итерации), между которыми состояние итератора сохранятеся.