70 likes | 166 Views
Создание пользовательского нумератора (интерфейсы lEnumerable и lEnumerator). Для этого примера нам потребуется класс Cars, который представляет собой набор уже знакомых нам объектов класса Са r Вот исходное определение класса Cars: // Cars - набор объектов класса Са r public class Cars {
E N D
Создание пользовательского нумератора(интерфейсы lEnumerable и lEnumerator)
Для этого примера нам потребуется класс Cars, который представляет собой набор уже знакомых нам объектов класса Саr Вот исходное определение класса Cars: // Cars - набор объектов класса Саr public class Cars { private Car[] carArray; // При создании объекта класса Cars заполняем его несколькими объектами Саг public Cars() { carArray = new Car[4]; carArray[0] - new Car(“FeeFee”, 200, 0); carArray[l] = new Car(“Clunker“, 90. 0); carArray[2] - new Car(“Zippy”, 30. 0); carArray[l] - new Car(“Fred”, 30, 0); } }
// Кажется очень заманчивым public class CarDriver public static void Main() { Cars carLot = new Cars(); // Пробуем использовать foreach для обращения к каждому объекту Саг внутри // набора, представленного carLot foreach(Car с in carlot){ { Console.WriteLinet("Name: {0}“, c.PetName); Console.WrlteLlne("Max speed: {0}“, c.MaxSpeed); } } }
// Для применения конструкции foreach необходимо, чтобы класс реализовывал интерфейс I Enumerable public class Cars : lEnumerable { // Интерфейс lEnumerable определяет этот метод (и ничего больше): public IEnumerator GetEnumerator() { // А дальше-то что? }
// GetEnumerator() возвращает что-нибудь из нижеперечисленного public interface lEnumerator bool MoveNext(); // Передвинуть внутренний указатель (курсор) // на одну позицию object Current {get:} // Получить текущий элемент набора (свойство только // для чтения) void Reset(); // Установить курсор в начало набора (на первый // обьект) } Учитывая, что lEnumerable.GetEnumerator() возвращает интерфейс lEnumerator, класс Cars придется переделать следующим образом: // Уже теплее public class Cars: lEnumerable. lEnumerator { // Реализация lEnumerable public lEnumerator GetEnumerator() { return (lEnumerator)this; }
// Набор объектов Саг с реализованный нумератором! public class Cars: Enumerator, Enumerable { private car[] carArray: // Переменная для текущей позиции элемента в массиве int pos = -1; public Cars (){ // Здесь иы создаем несколько объектов класса Саг и добавляем их в массив } // Реализация методов интерфейса IEnumerator public bool MoveNext() { if (pos < carArray.Length> { pos++; return true: } else return false: } public void Reset () { pos = 0: } public object Current { get { return carArray[pos] ; } // Реализация метода интерфейса lEnumerable public Enumerator GetEnumerator[] { return (lEnumerator)this: } }
Во-первых, теперь с нашим классом стало возможно работать при помощи синтаксиса foreach: // Ура! foreach <Car с in carLot> { Console.WriteLine("Name: {0}", c.PetName); Console.WriteLine("Max speed: {0}“, c.MaxSpeed): } Во-вторых, теперь в нашем распоряжении есть новые способы обращения кобъектам класса Саг, находящимся внутри объекта класса Cars (что очень похожена интерфейс lEnumXXXX в СОМ): // Обращаемся к объектам Саг через IEnumerator lEnumerator itfEnum; itfEnum = (lEnumerator)carLot; // Устанавливаем курсор на начало itfEnum.Reset(); // Перемещаем курсор вперед на один шаг ItfEnum.MoveNext(); // Выбираем одну машину и включаем в ней радио object curCar = itfEnum.Current; ((Саг)сurСаг).CrankTunes(true):