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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод обобщенного класса 
:(
    Опции темы
dezmond06
Дата 24.5.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, не бейте сильно, если вопрос тупой или сто раз обсуждался, но нужна помощь.
В общем, по заданию есть такая конкретная ситуация:
Обычная учебная задачка, есть класс самолетов, класс автобусов, наследующие самосозданный интерфейс Транспорт, надо с помощью генерика вывести список рейсов в datagridview.
Буквально задание звучит так:
"Создать класс-прототип для хранения и обработки экземпляров классов, наложить ограничение на параметр типа данных: тип-аргумент должен реализовывать интерфейс Транспорт
...
Формирование и вывод списка авиарейсов до Лондона (использовать стандартную коллекцию ArrayList)"
Вот основная процедура:
Код

private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog textopen = new OpenFileDialog();
            textopen.DefaultExt = "txt";
            if (textopen.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                FileStream openstream = new FileStream(textopen.FileName, FileMode.Open);
                Encoding enc = Encoding.GetEncoding(1251);
                StreamReader sreader = new StreamReader(openstream, enc);
                tcView.Visible = true;
                rtbRuns.Text = sreader.ReadToEnd();
                sreader.Close();
            }
            Regex rdata = new Regex(@"\b([а-я]+)\s(\d{3})\s([А-Яа-я]+)\s([А-Яа-я]+)\s((\d+\s*){2,4})(\s|$)");
            MatchCollection founded = rdata.Matches(rtbRuns.Text);
            restable = new ArrayList();
            if (founded.Count>0)
            {
            foreach (Match match in founded){

                if (match.Groups[1].Value == "лайнер")
                {
                    restable.Add(new TransProtoType<Plane>(new Plane(match.Groups[1].Value, match.Groups[2].Value,
                     match.Groups[3].Value + "-" + match.Groups[4].Value, match.Groups[5].Value)));
                }
                else
                {
                    restable.Add(new TransProtoType<Bus>(new Bus(match.Groups[1].Value, match.Groups[2].Value,
                        match.Groups[3].Value, match.Groups[4].Value, match.Groups[5].Value)));
                }
                
            }
            dgvRuns.AutoGenerateColumns = true;
            // Set up the data source.
            dgvRuns.DataSource = restable;
            // Automatically resize the visible rows.
            dgvRuns.AutoSizeRowsMode =DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
            // Set the DataGridView control's border.
            dgvRuns.BorderStyle = BorderStyle.Fixed3D;
            }


Здесь регэкспами из текста извлекаются рейсы, создаются экземпляры обобщенного класса, которым передается нужный тип и выводится в грид. В том то и дело, что ничего не выводится.

Созданный интерфейс (ничего интересного):
Код

interface iTransport
    {   double this[int inttickets]
        {  get;
            set;}
        string startingpoint
        {  get;
            set;}
        string destination
        {   get;
            set;}
        string vehicle
        {get;
          set;}
        void timetableoutput();
    }


Генерик:
Код

class TransProtoType<PT> where PT : iTransport
    {
        private PT inner;

        public TransProtoType(PT item)
        { inner = item; }
    }


Если вывожу через класс-обертку, то все выводится в штатном режиме, текст обертки не привожу - там ничего интересного, все поля - public.
Текст классов автобус и самолет тоже не привожу, но там тоже все выводимые поля - public, как можно их вывести, почему грид не подхватывает их автоматом? Ведь генерику тип исправно передается, в отладчике смотрю - ArrayList коллекция restable создается и правильно заполняется.
Есть мысли?
PM MAIL   Вверх
-Mikle-
Дата 24.5.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



А что ты хочешь? В классе TransProtoType нет ни одного свойства. Дженерик тип это же не наслежник для конкретезирующих типов. Плюс еще классы TransProtoType<Bus> и TransProtoType<Plane> абсолютно разные типы между которыми нет ничего общего (про ковариантность иконтрвариантность в 4ой версии - отдельная тема). Вот и результат - пустой грид. Как вариант в твоем случае могу посоветовать отнаследовать сам TransProtoType от iTransport и в нем реализовать свойства которые будут делегировать вызовы экземпляру в поле inner.
Код

public string startingpoint
{
    get { return inner.startingpoint; }
    set { inner.startingpoint = value; }
}



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dezmond06
Дата 26.5.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот сделал, как вы говорили, уже обрадовался. А тут такой страшный зверь выскакивает при попытке промотать грид:
user posted image
Вначале вроде в грид выводится, а если мотать вниз, то вот.

Пишет, насколько я понял, несоответствие типов при доступе к полю inner по аксессору get. Явное приведение не работает.
И еще, как вывести массив tickets из inner? А то на массиве он почему-то даже в отладчике вылетает, когда хочу посмотреть его содержимое в Locals.
Вот код класса-дженерика:

Код

    class TransProtoType<T> : iTransport
    where T : iTransport
    {
        public List<T> transarr = new List<T>();
        double[] tickets = new double[3];
        public T inner;

        public TransProtoType(T item)
        { inner = item;}

        public double this[int inttickets]
        {
            get
            {
                if ((inttickets < 0) & (inttickets > 3))
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    return inner[inttickets];
                }
            }
            set
            {
                if ((inttickets < 0) & (inttickets > 3))
                {
                    throw new IndexOutOfRangeException();
                }
                else
                {
                    inner[inttickets] = value;
                }
            }
        }

        public string startingpoint
        {
            get { return inner.startingpoint; }
            set { inner.startingpoint = value; }
        }

        public string destination
        {
            get {return inner.destination;}
            set { inner.destination = value; }
        }

        public string vehicle
        {
            get {return inner.vehicle;}
            set { inner.vehicle = value; }
        }

        public void timetableoutput()
        { }

        
    }


Это сообщение отредактировал(а) dezmond06 - 26.5.2011, 09:49
PM MAIL   Вверх
-Mikle-
Дата 26.5.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Ошибка да, как я и говорил классы TransProtoType<Bus> и TransProtoType<Plane> абсолютно разные типы, но я надеялся что грид как-нить разберется с этим.
Попробуй в гриде явно прописать колонки, то есть не AutoGenerateColumns = true, а вручную.

PS: Вообще задача сама по себе странная. Наличие в ней дженерика не имеет смысла.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dezmond06
Дата 27.5.2011, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я, честно говоря, см не понимаю зачем это надо, какое-то глупое задание, но чисто технически это можно сделать?
Да, вы правы, если убрать ветку else и создавать только объекты одного типа, то все выводится без проблем. Значит, грид просто не может корректно вывести их одновременно, а как это  можно обойти?
Поясните как нужно вручную создать колонки для каждого типа. Он же сам создает их, подхватывая public-поля.

Это сообщение отредактировал(а) dezmond06 - 27.5.2011, 08:56
PM MAIL   Вверх
dezmond06
Дата 27.5.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема решилась заменой arraylist на List<iTransport> и наследованием генерика от List<iTransport>, грид теперь не плюется  smile Но остался вопрос с выводом билетов, они по-прежнему заносятся криво, в отладчике видно что корректно заполнены массивы только объектов типа Bus, а Plane - ни в какую. При попытке посмотреть поле inner в отладчике в объектах plane отладчик по-прежнему вылетает, а перед этим показывает странную картину

user posted image

Есть мысли какие? И как правильно вывести массив билетов в грид подскажите, плиз.
PM MAIL   Вверх
dezmond06
Дата 6.6.2011, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос еще актуален.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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