Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
1

Как прописать метод класса, чтобы он мог принимать разные делегаты с одинаковой сигнатурой?

04.10.2018, 13:39. Показов 1673. Ответов 5

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Есть класс Gradient у него есть метод GetDerivative1, хотелось бы чтобы этот метод мог считать значение разных функций с одинаковой сигнатурой. Для этого я в качестве одного из параметров данного метода прописал делегат с нужной сигнатурой.
(Func<double,double,double> function)
Но в этом случае, когда я пытаюсь в него отправить делегат прописанный в классе, он выдаёт ошибку - "Аргумент 1: не удается преобразовать из "Gradient.Gradient.Derivative1" в "System.Func<double, double, double>".".

Если же в параметрах метода вместо "Func<double,double,double> function" указать конкретный тип делегата (Derivative2 function), то при попытке передать в метод другой делегат с такой же сигнатурой вылезает ошибка "не удается преобразовать из "Gradient.Gradient.Derivative1" в "Gradient.Gradient.Derivative2"."

Можно ли сделать так чтобы метод мог разные делегаты с одинаковой сигнатурой?
Если нет, то как сделать чтобы метод мог считать значение разных функций с одинаковой сигнатурой?
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
77
78
79
80
81
82
83
84
85
86
public class Gradient
    {
        public delegate double Function(double x1, double x2);
        public delegate double Derivative1(double x1, double x2);
        public delegate double Derivative2(double x1, double x2);
        double[,] points;
        double e1;
        double e2;
        double countIter;
        double step;
        int k = 0;
        int i = 3;
        double deriv1;
        double deriv2;
        double func;
        double modulGrad;
        Function function;
        Derivative1 derivative1;
        Derivative2 derivative2;
 
        // Регистрируем делегат
        public void RegisterHandler(Function func)
        {
            function = func;
        }
        public void RegisterHandler(Derivative1 derivative)
        {
            derivative1 = derivative;
        }
        public void RegisterHandler(Derivative2 derivative)
        {
            derivative2 = derivative;
        }
        public Gradient(double[,] points, double e1, double e2, double countIter, double step, int k, int i)
        {
            this.points = points;
            this.e1 = e1;
            this.e2 = e2;
            this.countIter = countIter;
            this.step = step;
            this.k = k;
            this.i = i;
        }
 
        public void FindMin()
        {
            for (; ; )
            {
                if (i == 3)
                {
                    this.deriv1 = GetDerivative1(derivative1,k); //Аргумент 1: не удается преобразовать из radient.Gradient.Derivative1" 
                                                                                    //в "System.Func<double, double, double>"
                    this.deriv2 = GetDerivative2(derivative1, k);//не удается преобразовать из "Gradient.Gradient.Derivative1" в 
                                                                                    //"Gradient.Gradient.Derivative2"
                    Console.WriteLine(deriv1.ToString() + "  " + deriv2.ToString());
                    i++;
                }
                if (i == 4)
                {
                    this.modulGrad = GetModulGradirnt(this.deriv1,this.deriv2);
                    if (this.modulGrad <= this.e1)
                    {
                        Console.WriteLine("Шаг 4 derivative (  "+deriv1.ToString() + "  ;  " + deriv2.ToString()+ "  ) ||f(x)=  "+);
                       
                        break;
                    }
                    else
                    {
                        i++;
                    }
                }
                
            }
        }
 
        //Расчёт значения производной в точке
        public double GetDerivative1(Func<double,double,double> function, int k)
        {
            return function(points[0, k], points[1, k]);
        }
        public double GetDerivative2(Derivative2 function, int k)
        {
            return function(points[0, k], points[1, k]);
        }
        
   }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2018, 13:39
Ответы с готовыми решениями:

Как сделать так чтобы метод мог принимать списки объектов разных типов?
Хочу написать метод который будет принимать два параметра, 1) Список 2) Индекс и будет удалять...

Как переопределить функцию так, чтобы она не только могла принимать разные параметры, но и возвращать тоже разные?
То есть я считаю несправедливым, если такое проканывает: void f () {;} void f (int) {;} а...

Как сделать так, чтобы код мог принимать только определенные числа?
Дело в том, что если вводить числа с 5-ти до 8-ми, то ответы в коде сходятся, а если ввести числа...

Как сделать так чтобы сервер мог принимать данные сразу от двух клиентов?
вот у меня есть клиент-серверное приложение сервер #include &lt;stdio.h&gt; #include &lt;windows.h&gt;...

5
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
04.10.2018, 14:07 2
Лучший ответ Сообщение было отмечено Volodya_ как решение

Решение

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
77
78
79
80
    public class Gradient
    {
        double[,] points;
        double e1;
        double e2;
        double countIter;
        double step;
        int k = 0;
        int i = 3;
        double deriv1;
        double deriv2;
        double func;
        double modulGrad;
        Func<double, double, double> function;
        Func<double, double, double> derivative1;
        Func<double, double, double> derivative2;
 
        // Регистрируем делегат
        public void RegisterHandler(Func<double, double, double> func)
        {
            function = func;
        }
        public void RegisterHandler1(Func<double, double, double> derivative)
        {
            derivative1 = derivative;
        }
        public void RegisterHandler2(Func<double, double, double> derivative)
        {
            derivative2 = derivative;
        }
        public Gradient(double[,] points, double e1, double e2, double countIter, double step, int k, int i)
        {
            this.points = points;
            this.e1 = e1;
            this.e2 = e2;
            this.countIter = countIter;
            this.step = step;
            this.k = k;
            this.i = i;
        }
 
        public void FindMin()
        {
            for (; ; )
            {
                if (i == 3)
                {
                    this.deriv1 = GetDerivative1(derivative1, k);
                    this.deriv2 = GetDerivative2(derivative1, k);
                    Console.WriteLine(deriv1.ToString() + "  " + deriv2.ToString());
                    i++;
                }
                if (i == 4)
                {
                    this.modulGrad = GetModulGradirnt(this.deriv1, this.deriv2); // Error CS0103  The name 'GetModulGradirnt' does not exist in the current context
                    if (this.modulGrad <= this.e1)
                    {
                        Console.WriteLine("Шаг 4 derivative (  " + deriv1.ToString() + "  ;  " + deriv2.ToString() + "  ) ||f(x)=  " +);
 
                        break;
                    }
                    else
                    {
                        i++;
                    }
                }
            }
        }
 
        //Расчёт значения производной в точке
        // зачем 2 одинаковых метода?
        public double GetDerivative1(Func<double, double, double> function, int k)
        {
            return function(points[0, k], points[1, k]);
        }
        public double GetDerivative2(Func<double, double, double> function, int k)
        {
            return function(points[0, k], points[1, k]);
        }
    }
1
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
04.10.2018, 16:27 3
Цитата Сообщение от Volodya_ Посмотреть сообщение
Можно ли сделать так чтобы метод мог разные делегаты с одинаковой сигнатурой?
Нет.
Используйте один и тот же тип делегата везде, где хотите использовать одну и ту же сигнатуру.
1
14 / 12 / 3
Регистрация: 20.02.2018
Сообщений: 446
04.10.2018, 19:11  [ТС] 4
Цитата Сообщение от kolorotur Посмотреть сообщение
Нет.
Используйте один и тот же тип делегата везде, где хотите использовать одну и ту же сигнатуру.
А как же вариант Someone007 ?
0
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
04.10.2018, 19:35 5
Цитата Сообщение от Volodya_ Посмотреть сообщение
А как же вариант Someone007 ?
У него все делегаты одного типа.
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
06.10.2018, 00:21 6
Цитата Сообщение от Volodya_ Посмотреть сообщение
Если нет, то как сделать чтобы метод мог считать значение разных функций с одинаковой сигнатурой?
Делегат можно преобразовать в другой тип с такой же сигнатурой.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        static void Main(string[] args)
        {
            MyDelegate myDelegate = new MyDelegate(MyMethod);
            MyDelegate2 myDelegate2 = new MyDelegate2(myDelegate); // cast from MyDelegate to MyDelegate2
            Func<int,int,int> func = new Func<int, int, int>(myDelegate2); // cast from MyDelegate to Func<int,int,int>
        }
 
        delegate int MyDelegate(int x, int y);
        delegate int MyDelegate2(int x, int y);
 
        private static int MyMethod(int x, int y)
        {
            return 0;
        }
1
06.10.2018, 00:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2018, 00:21
Помогаю со студенческими работами здесь

Делегаты с похожей, но разной сигнатурой
Извиняюсь за глупые вопросы, но помогите пожалуйста, понять суть происходящего. Возможно ли...

Прописать в программе путь к файлу чтобы он мог открываться с любого ПК
День добрый, возникла такая проблема. Как прописать в программе путь к файлу что бы он мог...

Что прописать в роутах, чтобы сайт мог работать не в корне, а каталоге
Приветствую коллеги! Не могу осилить, что в роутах прописать, чтобы запустить проект в отдельной...

Рефакторинг участков кода с одинаковой сигнатурой, но разными именами объектов
В процессе роста программы, в довольно большом количестве стали возникать участки кода с одинаковой...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru