Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Оксана 1234
4 / 4 / 3
Регистрация: 10.04.2013
Сообщений: 172
1

Generics и абстрактный метод

16.10.2017, 01:20. Просмотров 121. Ответов 1
Метки нет (Все метки)

Есть два класса, Point и Point1D. Первый родительский для второго, также Point1D использует параметризованные типы. И вот такая проблема перегружая метод в котором возвращаю массив все работает, если использую List - ошибка.

Мне надо использовать List или еще какую коллекцию, но не делать класс Point парметризованим.

Этот код не работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    public abstract class Point
    {
        protected abstract List<Point> CreateRandom(int down, int up, int size);
    }
 
    public class Point1D<T> : Point where T : struct, IConvertible, IComparable<T>
    {
        List<Point1D<T>> array_of_points1D;
 
        private T X { get; set; }
 
        public Point1D()
        {
 
        }
 
        public Point1D(int Size)
        {
            array_of_points1D = new List<Point1D<T>>(Size);
            for(int i=0; i<Size;i++)
            {
                array_of_points1D[i] = new Point1D<T>();
            }
        }
 
        protected override List<Point> CreateRandom(int down, int up, int size)
        {
            Point1D<T> points1D= new Point1D<T>(size);
            Random rnd = new Random();
            for (int i = 0; i < points1D.array_of_points1D.Capacity; i++)
            {
                points1D.array_of_points1D[i].X = (T)Convert.ChangeType((object)(rnd.NextDouble() * (up - down) + down),typeof(T));
            }
            return points1D.array_of_points1D;
        }
    }
Этот код работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
   public abstract class Point
    {
        protected abstract Point[] CreateRandom(int down, int up, int size);
    }
 
    public class Point1D<T> : Point where T : struct, IConvertible, IComparable<T>
    {
        Point1D<T>[] array_of_points1D;
 
        private T X { get; set; }
 
        public Point1D()
        {
 
        }
 
        public Point1D(int Size)
        {
            array_of_points1D = new Point1D<T>[](Size);
            for(int i=0; i<Size;i++)
            {
                array_of_points1D[i] = new Point1D<T>();
            }
        }
 
        public override Point[] CreateRandom(int down, int up, int size)
        {
            Point1D<T> points1D = new Point1D<T>(size);
            Random rnd = new Random();
            for (int i = 0; i < points1D.array_of_points1D.Length; i++)
            {
                points1D.array_of_points1D[i].X = (T)Convert.ChangeType((object)(rnd.NextDouble() * (up - down) + down), typeof(T));
            }
            return points1D.array_of_points1D;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2017, 01:20
Ответы с готовыми решениями:

Абстрактный метод в обычном классе
Объявления абстрактных методов допускаются только в абстрактных классах ...

Объясните, для чего вообще нужен абстрактный метод?
Доброе время суток, объясните пожалуйста, для чего вообще нужен абстрактный...

Публичный абстрактный метод MakeSound без аргументов, возвращает string
Можно пример кода, что подходит под следующее описание: 1) Публичный...

Создать базовый класс "Работник", в нем абстрактный метод подсчета зарплат
Надо создать базов. класс работников в нем абстрактн. метод подсчета зартплат....

Реализовать Generics очередь
Реализовать обобщенную (Generics) структуру данных «очередь», позволяющую...

1
jetyb
158 / 158 / 70
Регистрация: 26.10.2012
Сообщений: 498
Завершенные тесты: 1
16.10.2017, 08:40 2
Варианты:
1. Применить преобразование типов
C#
1
2
3
4
5
6
        protected override List<Point> CreateRandom(int down, int up, int size)
        {
            //...
            // points1D.array_of_points1 is List<Point1D<T>>
            return points1D.array_of_points1D.Cast<Point>().ToList();
        }
2. Коварицация/контравариация не применима к обобщенным классам (в данном случае List), ее можно применять только к обобщенным интерфейсам (например IList ).
C#
1
2
3
4
5
6
        protected override IList<Point> CreateRandom(int down, int up, int size)
        {
            //...
            // points1D.array_of_points1 is List<Point1D<T>>
            return points1D.array_of_points1D;
        }
Тут возвращаемый тип абстрактного метода заменяется на интерфейс.

Добавлено через 9 минут
Правда в таком случае есть ограничение:
ковариацию можно применить только к ссылочным типам, если класс T - структура (а в теме это так и есть) - то 2 способ не сработает.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2017, 08:40

Binary Tree (Generics)
Как данную структуру бинарного дерева реализовать с помощью обобщенной...

Чем отличаются C# Generics и C++ Templates ?
Чем отличаются C# Generics и C++ Templates ?

Сравнение типов для Обощений (Generics)
Доброго времени суток. Подскажите, пожалуйста, как можно проверить, является...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru