Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2012, 19:23   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Generic C#

Дан набор классов, необходимо переделать pointcollection в generic.
Код:
namespace MyLibC
{
    [Serializable]
    class PointCollection : System.Collections.CollectionBase
    {
        public Point Add()
        {
            Point Item = new Point();
            List.Add(Item);
            return Item;
        }

        public Point Add(Point Item)
        {
            List.Add(Item);
            return Item;
        }

        public void Insert(int Index, Point Item)
        {
            List.Insert(Index, Item);
        }

        public void Remove(Point Item)
        {
            List.Remove(Item);
        }

        public Point this[int Index]
        {
            get
            {
                return (Point)List[Index];
            }
        }

        public void Save()
        {
            SaveFileDialog svfDialog = new SaveFileDialog();
            svfDialog.Filter = "Point file (*.pf)|*.pf";
            svfDialog.DefaultExt = "pf";
            if (svfDialog.ShowDialog() == DialogResult.OK)
            {
                FileStream fStream = null;
                SoapFormatter mySoapFormatter = new SoapFormatter();

                try
                {
                    fStream = new FileStream(svfDialog.FileName,
                                    FileMode.Create, FileAccess.Write);
                    mySoapFormatter.Serialize(fStream, this);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                finally
                {
                    if (fStream != null) fStream.Close();
                }
            }
        }

        public static PointCollection Load()
        {
            FileStream fStream = null;
            PointCollection mc;
            SoapFormatter mySoapFormatter = new SoapFormatter();
            OpenFileDialog opfDialog = new OpenFileDialog();
            opfDialog.Filter = "Point file (*.pf)|*.pf";

            if (opfDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    fStream = new FileStream(opfDialog.FileName,
                                      FileMode.Open, FileAccess.Read);
                    mc = (PointCollection)mySoapFormatter.Deserialize(fStream);
                    return mc;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                finally
                {
                    if (fStream != null) fStream.Close();
                }
            }
            return null;
        }
    }
}
Как сделать, может есть любители Такого. И еще вопрос насколько часто это используется и когда это оправдано?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.10.2012, 19:37   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Добавляете к названию класса "<T>"
Код:
    [Serializable]
    class PointCollection<T> : System.Collections.CollectionBase
    {
......
А дальше все "Point" в классе заменяете на "T"
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 12.10.2012, 19:50   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

что значит все?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.10.2012, 19:51   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот класс поинт3d
Код:
    [Serializable]
    class Point3D : Point
    {
        public Int32 z;
        public Point3D()
            : base()
        {
            z = 0;
        }

        public Point3D(Int32 x, Int32 y, Int32 z)
            : base(x, y)
        {
            this.z = z;
        }
        public override double Metric()
        {
            return Math.Sqrt((x * x + y * y + z * z));
        }

        public override String ToString()
        {
            return String.Format("({0} , {1}, {2})", x, y, z);
        }

    }
}
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.10.2012, 19:52   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

параметры у методов?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.10.2012, 19:55   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Метод Add() в классе коллекции проще выбросить.
Для структур переделать его просто, а для классов уже нет.
eval вне форума Ответить с цитированием
Старый 12.10.2012, 19:56   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

эм а можно показать у меня с ООП проблема
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.10.2012, 19:58   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
[Serializable]
    class PointCollection<T> : System.Collections.CollectionBase
	where T: class, new()
    {
        public T Add()
        {
            T Item = new T();
            List.Add(Item);
            return Item;
        }

        public T Add(T Item)
        {
            List.Add(Item);
            return Item;
        }

        public void Insert(int Index, T Item)
        {
            List.Insert(Index, Item);
        }

        public void Remove(T Item)
        {
            List.Remove(Item);
        }

        public T this[int Index]
        {
            get
            {
                return (T)List[Index];
            }
        }

        public void Save()
        {
            SaveFileDialog svfDialog = new SaveFileDialog();
            svfDialog.Filter = "Point file (*.pf)|*.pf";
            svfDialog.DefaultExt = "pf";
            if (svfDialog.ShowDialog() == DialogResult.OK)
            {
                FileStream fStream = null;
                SoapFormatter mySoapFormatter = new SoapFormatter();

                try
                {
                    fStream = new FileStream(svfDialog.FileName,
                                    FileMode.Create, FileAccess.Write);
                    mySoapFormatter.Serialize(fStream, this);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                finally
                {
                    if (fStream != null) fStream.Close();
                }
            }
        }
Примерно так

К прочтению рекомендую http://msdn.microsoft.com/ru-ru/library/512aeb7t.aspx и http://msdn.microsoft.com/ru-ru/library/d5x73970.aspx
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 12.10.2012, 20:05   #9
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

спасибо, последний вопрос как исправить
Код:
        private PointCollection pc = new PointCollection();
Вот так?
Код:
private PointCollection<Point3D> pc = new PointCollection<Point3D>();
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 12.10.2012 в 20:10.
Sparky вне форума Ответить с цитированием
Старый 12.10.2012, 20:10   #10
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
private PointCollection<имя_класса> pc = new PointCollection<имя_класса>();
где "имя_класса" - название класса, коллекцию элементов которого вы собираетесь создать
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц