Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > использование интерфейсов


Автор: Sash_79 8.11.2007, 22:58
помогите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();
        }
    }
}

Автор: 0000 8.11.2007, 23:31
class cars:IEnumerable,IEnumerator


это что такое?? класс и итерируемый и итератор???????  эт не дело..делай отдельный итератор, который в конструкторе принимает массив элементов car

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

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

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

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

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

Автор: Sash_79 9.11.2007, 13:56
tol05, интерфейс определен два раза в одной и той же области видимости-это ошибка, но мне хотелось бы узнать почему компилятор зацикливается на foreach

Автор: 1stain 9.11.2007, 14:46
тебе ж уже написали: 
Цитата(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>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)