| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > использование интерфейсов |
| Автор: Sash_79 8.11.2007, 22:58 |
| помогите using System; using System.Collections.Generic; using System.Text; namespace glava_4_numerator { //------------------------------------------------- class car { public int currSpeed; public int maxSpeed; public string petName; public car(string name, int max, int curr) { currSpeed = curr; maxSpeed = max; petName = name; } } //----------------------------------------------------- public interface IEnumerable { IEnumerator GetEnumerator(); } //------------------------------------------------------ public interface IEnumerator { bool MoveNext(); object current { get;} void Reset(); } //------------------------------------------------------ class cars:IEnumerable,IEnumerator { int pos = -1; public bool MoveNext() { if (pos < cararray.Length) { pos++; return true; } return false; } public void Reset() { pos = 0; } public object current { get { return cararray[pos]; } } private car[] cararray; public IEnumerator GetEnumerator() { return (IEnumerator)this; } public cars() { cararray = new car[4]; cararray[0] = new car("feefee", 200, 0); cararray[1] = new car("cluner", 90, 0); cararray[2] = new car("zippy",120,0); cararray[3] = new car("BMW", 150, 0); } } class work { static void Main(string[] args) { cars m3=new cars(); IEnumerable h = (IEnumerable)m3; h.GetEnumerator(); IEnumerator itfEnum; itfEnum = (IEnumerator)m3; foreach (car c in m3) { Console.WriteLine("Name: {0}",c.petName); Console.WriteLine("Max speed: {0}",c.maxSpeed); } IEnumerator itfEnum; itfEnum=(IEnumerator)m3; itfEnum.Reset(); itfEnum.MoveNext(); object curCar=itfEnum.current; Console.ReadLine(); } } } |
| Автор: 0000 8.11.2007, 23:31 |
| class cars:IEnumerable,IEnumerator это что такое?? класс и итерируемый и итератор??????? эт не дело..делай отдельный итератор, который в конструкторе принимает массив элементов car |
| Автор: tol05 9.11.2007, 10:29 |
Это пример из учебника Троелсена. И старого издания (для FW1), и нового (для FW2). Так что делать так можно... по крайней мере Троелсену, он считается уже "классиком". Другое дело, что с точки зрения архитектуры это решение отвратительное... ну да он всегда так пишет. Sash_79, примеры нужно переписывать внимательно (свойство Current нужно писать с большой буквы) и вдумчиво. Почему определен два раза в одной и той же области видимости. Это элементарная ошибка. И вообще, зачем определять интерфейсы в коде. Что, стандартные IEnumerable,IEnumerator не подходят? свои нужно расписывать? Проверки на выход за пределы массива нет. Это тоже плохо. |
| Автор: Sash_79 9.11.2007, 13:56 |
| tol05, интерфейс определен два раза в одной и той же области видимости-это ошибка, но мне хотелось бы узнать почему компилятор зацикливается на foreach |
| Автор: 1stain 9.11.2007, 14:46 |
| тебе ж уже написали: что непонятного? кроме того, в методе MoveNext стоило бы поменять условие: вместо if (pos < cararray.Length) писать if (pos < cararray.GetUpperBound(0)) з.ы. в реальном коде не пиши свои интерфейсы, которые уже существуют. В данном случае класс Cars стоило бы наследовать от System.Collections.IEnumerable & System.Collections.IEnumerator. А еще лучше (имхо) - от класса System.Collections.ObjectModel.Collection<Car> |