Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование интерфейсов, проблема foreach 
:(
    Опции темы
Sash_79
Дата 8.11.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.5.2007

Репутация: нет
Всего: нет



помогитеsmile выдает ошибку на foreach. Заранее очень признателен!

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

PM MAIL   Вверх
0000
Дата 8.11.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: нет
Всего: 5



class cars:IEnumerable,IEnumerator


это что такое?? класс и итерируемый и итератор???????  эт не дело..делай отдельный итератор, который в конструкторе принимает массив элементов car
PM MAIL ICQ   Вверх
tol05
Дата 9.11.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Цитата(0000 @  8.11.2007,  22:31 Найти цитируемый пост)
это что такое?? класс и итерируемый и итератор???????  эт не дело..

Это пример из учебника Троелсена. И старого издания (для FW1), и нового (для FW2). Так что делать так можно... по крайней мере Троелсену, он считается уже "классиком".
Другое дело, что с точки зрения архитектуры это решение отвратительное... ну да он всегда так пишет.

Sash_79, примеры нужно переписывать внимательно (свойство Current нужно писать с большой буквы) и вдумчиво. Почему 
Цитата(Sash_79 @  8.11.2007,  21:58 Найти цитируемый пост)
 IEnumerator itfEnum;
 определен два раза в одной и той же области видимости. Это элементарная ошибка. 

И вообще, зачем определять интерфейсы в коде. Что, стандартные IEnumerable,IEnumerator не подходят? свои нужно расписывать?

Проверки на выход за пределы массива нет. Это тоже плохо.


Это сообщение отредактировал(а) tol05 - 9.11.2007, 10:30


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Sash_79
Дата 9.11.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.5.2007

Репутация: нет
Всего: нет



tol05, интерфейс определен два раза в одной и той же области видимости-это ошибка, но мне хотелось бы узнать почему компилятор зацикливается на foreach
PM MAIL   Вверх
1stain
Дата 9.11.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 3
Всего: 40



тебе ж уже написали: 
Цитата(tol05 @  9.11.2007,  10:29 Найти цитируемый пост)
свойство Current нужно писать с большой буквы

что непонятного?

кроме того, в методе MoveNext стоило бы поменять условие: вместо if (pos < cararray.Length) писать if (pos < cararray.GetUpperBound(0))

з.ы. в реальном коде не пиши свои интерфейсы, которые уже существуют. В данном случае класс Cars стоило бы наследовать от System.Collections.IEnumerable & System.Collections.IEnumerator. А еще лучше (имхо) - от класса System.Collections.ObjectModel.Collection<Car>

Это сообщение отредактировал(а) 1stain - 9.11.2007, 14:52


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.