60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
1

Перегрузка операторов в обобщенном классе

17.02.2017, 17:54. Показов 3360. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Вопрос такой: "Можно ли в обобщённом классе как-нибудь перегрузить операторы *, -, +"?

У меня сейчас выдаёт ошибку: "Оператор * невозможно использовать с операндами типа "Т" "Т".

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
class MyArray<T> where T: IComparable<T>
    {
        public int Size { set; get; }
        T[] Array { set; get; }
 
        public MyArray(int size)
        {
            Size = size;
 
            Array = new T[Size];
        }
 
        public static MyArray<T> operator *(MyArray<T> first, MyArray<T> second)
        {
            if(first.Size == second.Size)
            {
                MyArray<T> array = new MyArray<T>(first.Size);
 
                for(int i = 0; i < array.Size; i++)
                {
                    array[i] = first[i] * second[i];
                }
 
                return array;
            }
        }
 
        public static bool operator ==(MyArray<T> first, MyArray<T> second)
        {
            if (first.Size == second.Size)
            {
                for (int i = 0; i < first.Size; i++)
                {
                    if(first[i].CompareTo(second[i]) != 0)
                    {
                        return false;
                    }
                }
 
                return true;
            }
 
            return false;
        }
 
        public static bool operator !=(MyArray<T> first, MyArray<T> second)
        {
            if (first.Size == second.Size)
            {
                for (int i = 0; i < first.Size; i++)
                {
                    if (first[i].CompareTo(second[i]) == 0)
                    {
                        return false;
                    }
                }
 
                return true;
            }
 
            return true;
        }
 
        public T this[int index]
        {
            set
            {
                Array[index] = value;
            }
 
            get
            {
                return Array[index];
            }
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2017, 17:54
Ответы с готовыми решениями:

Перегрузка операторов в обобщенном классе. Сложение, вычитание типов T
Потихоньку изучаю C#. Тут решил написать обобщенный класс, который тип T представляет из себя любой...

Перегрузка операторов в классе треугольник. Ошибка "бинарный оператор принимает два параметра"
Создать класс треугольник, члены класса - длины 3-х сторон. Предусмотреть в классе методы проверки...

Перегрузка операторов в классе "Прямая"
Реализовать принцип инкапсуляции и решить задачу. Класс:Прямая; Члены класса:Координаты двух...

Как суммировать переменные Т в обобщенном классе?
Компилятор пишет что невозможно применить оператор + к переменным типа Т. Вот код,в котором...

11
3477 / 2482 / 1172
Регистрация: 14.08.2016
Сообщений: 8,180
17.02.2017, 18:02 2
afaik, низя
1
64 / 68 / 18
Регистрация: 21.10.2015
Сообщений: 228
17.02.2017, 18:06 3
тут решать либо unsafeом (указатели) либо рефлексия
1
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
17.02.2017, 18:11  [ТС] 4
iDReeM, я подумал о рефлексии сразу, как только увидел эту ошибку. В сторону unsafe даже не смотрел.
0
64 / 68 / 18
Регистрация: 21.10.2015
Сообщений: 228
17.02.2017, 18:30 5
ограничения, ограничения...
нужно заставить поверить компилятор, что T принимает только "типы значений", с которыми можно проводить операции подобного рода. Проще всего - поставив ограничение на ссылочные типы.

Добавлено через 5 минут
Цитата Сообщение от iDReeM Посмотреть сообщение
ограничения, ограничения...
нужно заставить поверить компилятор, что T принимает только "типы значений", с которыми можно проводить операции подобного рода. Проще всего - поставив ограничение на ссылочные типы.
а нет, не помогло. дело в классе.
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
17.02.2017, 18:40  [ТС] 6
iDReeM, я пробовал ставить ограничение на ссылочный тип. Не работает. Тем более, я должен ещё иметь возможность использовать класс с базовыми типами данных.
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
17.02.2017, 19:45 7
Лучший ответ Сообщение было отмечено Соловьёв_Егор как решение

Решение

Соловьёв_Егор, в библиотеке MiscUtil Джона Скита есть класс Operator как раз для такого случая.
4
10 / 7 / 3
Регистрация: 25.02.2018
Сообщений: 86
25.09.2019, 18:46 8
Я скачал, там просто статический класс, как именного его можно использовать для решения проблемы? или где взять примеры решения?
Миниатюры
Перегрузка операторов в обобщенном классе  
0
10 / 7 / 3
Регистрация: 25.02.2018
Сообщений: 86
25.09.2019, 18:50 9
Или, например, мне нужно в классе комплексных чисел вставить функцию sin, которая будет выражаться через Math.Sin. Как убедить компилятор, что у Math.Sin найдется перегрузка, принимающая тип T?
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
25.09.2019, 19:00 10
Дмитрий Паскаль, по моему все ясно из сигнатуры обобщенных методов. Передаем два операнда - получаем результат.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Main()
{
    var intExample = new Example<int>();
    int intResult = intExample.Add(10, -17);
    Console.WriteLine(intResult);
    
    var doubleExample = new Example<double>();
    double doubleResult = doubleExample.Add(1, -1.7);
    Console.WriteLine(doubleResult);
}
 
class Example<T>
{
    public T Add(T x, T y)
    {
        return Operator.Add(x, y);
    }
}
Добавлено через 7 минут
Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
Как убедить компилятор, что у Math.Sin найдется перегрузка, принимающая тип T?
Написать обобщенный метод Sin по аналогии с обобщенными реализациями арифметических операций библиотеке MiscUitl.
1
10 / 7 / 3
Регистрация: 25.02.2018
Сообщений: 86
25.09.2019, 19:01 11
это ясно, но
1) если мне надо использовать тип T в методах других классов, ожидающих числа?
2) как постоянно обращение к Operator будет влиять на производительность?
0
Администратор
Эксперт .NET
16329 / 12818 / 5060
Регистрация: 17.03.2014
Сообщений: 26,086
Записей в блоге: 1
25.09.2019, 19:19 12
Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
если мне надо использовать тип T в методах других классов, ожидающих числа?
Надо значит используй.

Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
как постоянно обращение к Operator будет влиять на производительность?
Плохо скажется. Чудес увы не бывает. Если есть возможность то лучше отказаться от использования обобщений в данном случае.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2019, 19:19
Помогаю со студенческими работами здесь

Перегрузка операторов
Здравствуйте, скажите возможно ли перегрузить операторы +=, -=, *=, и вывод на консоль в си#?

Перегрузка операторов
Добрый день! Есть задание Разработайте класс для выполнения указанных функций для обработки...

Перегрузка операторов в с#
Создать класс &quot;квадратное уравнение&quot; с компонентными данными – коэффициентами. Перегрузить...

Перегрузка операторов
это все одно задание. Очень прошу вашей помощи, завтра зачет практики, а я еще вин форм колупаюсь...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru