С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/48: Рейтинг темы: голосов - 48, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181

Передать метод как параметр в конструктор с помощью делегатов

28.04.2014, 14:17. Показов 9156. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо передать функцию как параметр в конструктор.
Я прочитал про делегаты и описал его:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Attack
{
    //делегат для выбора функции
    public delegate double FunctionChoice(double[] dArrayArguments, double[] dMinArgument, double[] dMaxArgument, bool bMax);
    
    class TargetFunction
    {
 
        //функция Растригина
        public static double RastriginFunction(double[] dArrayArguments, double[] dMinArgument, double[] dMaxArgument, bool bMax)
        {
            int iDimension = dArrayArguments.Length;//размерность массива
            double dResult = 0.0;//результат функции Растригина
 
            for (int i = 0; i < dArrayArguments.Length; i++)
            {
                //проверка на выход из области определения функции
                if (!CheckFunctionArgument(ref dArrayArguments[i], ref dMinArgument[i], ref dMaxArgument[i]))
                    return ReturnInfinity(ref bMax);
 
                dResult += Math.Pow(dArrayArguments[i], 2) - 10 * Math.Cos(2 * Math.PI * dArrayArguments[i]);
            }
 
            dResult += 10 * iDimension;
            return dResult;
            }
}
        }
В необходимом классе есть поле public FunctionChoice _Funct;
Я в конструкторе прописываю:
_Funct = new FunctionChoice(TargetFunction.RastriginF unction);
и всё работает.
но как бы мне этот TargetFunction.RastriginFunction передать в конструктор в качестве параметра?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2014, 14:17
Ответы с готовыми решениями:

Передать метод как параметр в конструктор
Есть свой класс, мне нужно, чтобы создание его экземпляра было возможно таким образом: MyClass instanceOfMyClass = MyClass(() =&gt;{...

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

Передать метод как параметр в поток
Добрый день. Мне нужно передать в параметр метода метод Есть вот такой делегат public delegate int stringComparison(String A, String...

5
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
28.04.2014, 14:43  [ТС]
Вот сам проект. Кто-нибудь знает, в чём дело и как поправить?
Вложения
Тип файла: rar ParticleSwarmOptimisation.rar (34.4 Кб, 7 просмотров)
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.04.2014, 14:46
Чем Вам такой конструктор не по душе?
C#
1
2
3
4
public TargetFunction(FunctionChoice action)
{
    // что-то делаем с нашим делегатом action
}
1
1 / 1 / 0
Регистрация: 25.09.2013
Сообщений: 181
28.04.2014, 14:52  [ТС]
в конструторе я прописал:
C#
1
FunctionChoise _Funct = new FunctionChoise(Funct);
потом пишу:
C#
1
double dPbest = _pSwarm._Funct(_dCoordinates);
и выскакивает такая ошибка:
Ошибка 1 Неявное преобразование типа "ParticleSwarmOptimisation.TargetFunctio n" в "double" невозможно
0
1 / 1 / 2
Регистрация: 16.04.2014
Сообщений: 19
28.04.2014, 16:43
Рассматриваю приаттаченный проект.
Если я вас правильно понял, то замечания следующие...

1. Делегат в конструкторе объявляется так public ParticleSwarm(FunctionDelegate Funct - вы же туда передаете функцию целиком, а не только ее возвращаемое значение. И соответственно в теле конструктора надо писать _Funct = Funct;
2. double dPbest = _pSwarm._Funct(_dCoordinates); Выдает вполне справедливую ошибку. Ваш делегат возвращает ссылку на объект класса TargetFunction. Чтобы получить заветный double необходимо в этом классе еще вызвать метод RastriginFunction. Поэтому в вашем случае эта строка должна выглядеть как-то так: _dPbest = _pSwarm._Funct(_dCoordinates).RastriginF unction(_dCoordinates);
3. Чтобы пункт 2 сработал, метод RastriginFunction необходимо сделать не статическим.

Да, коряво... На самом деле, чтобы все было по фен-шую, вам надо переделать все эти классы. В конце-концов определиться, что должен возвращать делегат - переменную или целый класс...
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
28.04.2014, 17:29
Не понимаю, в чем проблема-передать делегат как параметр конструктора...
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass((Action<int, int>)delegate(int i, int j)
                {
                    //Тут операторы, которые будут выполняться делегатом класса
                    Console.WriteLine("{0}, {1}", i, j);
                });
            mc.RunDelegate();
            Console.ReadLine();
        }
    }
    public class MyClass
    {
        private Action<int, int> innerDelegate;
        public MyClass(Action<int,int> paramDelegate)
        {
            innerDelegate = paramDelegate;
        }
        public void RunDelegate()
        {
            innerDelegate(10, 20);
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2014, 17:29
Помогаю со студенческими работами здесь

Как передать в метод один параметр
Мне нужно передать в метода только второй параметр y и пропустить параметр x(он автоматически должен стать нулем). name(, 5); }...

Передать метод класса как параметр
Есть класс A, у него есть метод B, как метод B подсунуть в конструктор std::thread? Что-то типа такого class A { void B{ ... } ...

Передать метод как параметр функции
Добрый день. Есть такое:var a = object.next(); а также var a = object.prev(); Как сделать так, чтобы: function...

Передать параметр в конструктор
Можно ли передать параметры в конструктор класса: Private Sub Class_Initialize() End Sub

Передать метод как параметр и вызвать его
Доброго времени суток. Делаю XNA проект. Создаю игровое меню с кнопками. Меню - это класс, в который передаю список кнопок. В классе Меню...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru