1 / 7

Создание пользовательского нумератора (интерфейсы lEnumerable и lEnumerator)

Создание пользовательского нумератора (интерфейсы lEnumerable и lEnumerator). Для этого примера нам потребуется класс Cars, который представляет собой набор уже знакомых нам объектов класса Са r Вот исходное определение класса Cars: // Cars - набор объектов класса Са r public class Cars {

cullen
Download Presentation

Создание пользовательского нумератора (интерфейсы lEnumerable и lEnumerator)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Создание пользовательского нумератора(интерфейсы lEnumerable и lEnumerator)

  2. Для этого примера нам потребуется класс 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); } }

  3. // Кажется очень заманчивым 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); } } }

  4. // Для применения конструкции foreach необходимо, чтобы класс реализовывал интерфейс I Enumerable public class Cars : lEnumerable { // Интерфейс lEnumerable определяет этот метод (и ничего больше): public IEnumerator GetEnumerator() { // А дальше-то что? }

  5. // 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; }

  6. // Набор объектов Саг с реализованный нумератором! 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: } }

  7. Во-первых, теперь с нашим классом стало возможно работать при помощи синтаксиса 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):

More Related