5 / 5 / 3
Регистрация: 09.02.2014
Сообщений: 58
1

Как работает делегат в приведенном коде

05.08.2014, 13:55. Показов 1391. Ответов 10
Метки нет (Все метки)

Добрый день,

объясните пожалуйста как здесь работает делегат и зачем он вообще здесь нужен?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Инициализация делегата
public delegate ClassA UnitSelectionDelegate(object context);
 
                            //CurrentTarget это ClassА
Spell.ForceCast(SpellId.SoulburnSoulswap, on => Me.CurrentTarget, ret => Me.ActiveAuras.ContainsKey("SuperHero"));
                        
public static Composite ForceCast(string spell, UnitSelectionDelegate onUnit, Selection<bool> reqs = null)
        {
            return
                new Decorator(
                    ret => ((reqs != null && reqs(ret)) || (reqs == null)) && onUnit != null && onUnit(ret) != null && SpellManager.CanCast(spell, onUnit(ret)) && !IsChanneling,
                    new Action(ret => SpellManager.Cast(spell, onUnit(ret))));
        }
        
        }
Просто я не могу понять зачем здесь делагат,и на какой метод он показывает?
Код это конечно вырванный кусочек из целого,но там не где не идет привязка делегата к какому то либо методу.
Я просто не пойму где и о чем читать что бы уловить смысл этого кусочка кода
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2014, 13:55
Ответы с готовыми решениями:

Декодирование текста в приведенном коде работает некорректно
в конце не печатает s1 using System; using System.Collections.Generic; using System.Linq;...

Сколько аргументов требуется передать в делегат в приведенном коде
Код написан на с++/CLR, но отличия от с# минимальны так что думаю всем код понятен. Почему этот...

Как в приведенном коде работает malloc?
#include &lt;stdio.h&gt; #include &lt;memory.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include...

Как работает генерация случайных чисел в приведенном коде
Дорогие Форумчане! Подскажите пожалуйста, как работает нижеследующий код для генерации случайных...

10
7 / 7 / 3
Регистрация: 16.03.2013
Сообщений: 18
05.08.2014, 14:26 2
У вас делегат стоит в качестве формального параметра у статического метода ForceCast.
Соответственно, когда вы вызываете этот метод, то делегат инициализируется ссылкой на анонимный метод, записанный через лямбда-выражение:
C#
1
on => Me.CurrentTarget
0
5 / 5 / 3
Регистрация: 09.02.2014
Сообщений: 58
05.08.2014, 15:12  [ТС] 3
Спасибо,
а зачем так сделано не скажите?
Где плюсы? Ведь можно просто передать Me.CurrentTarget?
0
7 / 7 / 3
Регистрация: 16.03.2013
Сообщений: 18
05.08.2014, 15:35 4
По правде говоря, вот это
C#
1
on => Me.CurrentTarget
вообще компилироваться не должно, потому что, если вы утверждаете, что CurrentTarget это ClassA, то у вас анонимный метод возвращает тип, а по идее должен возвращать экземпляр класса ClassA.
А вообще по данному куску кода, данный делегат действительно бессмыслен.
0
1137 / 940 / 240
Регистрация: 15.06.2012
Сообщений: 3,654
Записей в блоге: 1
05.08.2014, 16:03 5
UnitSelectionDelegate выполняет некие действия над ret, который находится где-то внутри только что созданного Decorator. В вашем случае результат не зависит от входящего параметра, но в общем случае это не так.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
05.08.2014, 18:39 6
gerrus, делегат тут можно использовать, указав некий метод-фабрику для объектов класса ClassA.
В данном же примере используется только один объект класса ClassA, потому объявленный делегат используется только для указания параметра в функции ForceCast.
0
5 / 5 / 3
Регистрация: 09.02.2014
Сообщений: 58
05.08.2014, 20:29  [ТС] 7
а по идее должен возвращать экземпляр класса ClassA.
Да, простите, именно так и есть. Это экземпляр класса ClassA!

Спасибо за разъяснения, но я не чего так и не понял

Может кто нибудь сможет написать пример со "стандартным кодом" (для новичков с нормальным методом)?

Вот тоже кусочек:
C#
1
2
3
4
5
6
7
8
 public static Composite Cast(int spell, UnitSelectionDelegate onUnit, Selection<bool> reqs = null)
        {
            return
                new Decorator(
                    ret => (onUnit != null && onUnit(ret) != null && (reqs == null || reqs(ret)) &&
                        SpellManager.CanCast(spell, onUnit(ret) ),
                    new Sequence(
                        new Action(ret => SpellManager.Cast(spell, onUnit(ret))),
Что такое "ret"?
Тоже самое ,только с анонимным методом:
C#
1
2
3
4
5
6
7
 delegate(object ret)
                    {
                        return (onUnit != null && onUnit(ret) != null && (reqs == null || reqs(ret)) &&
                                SpellManager.CanCast(spell, onUnit(ret)) );
                    },
 new Sequence(
                        new Action(ret => SpellManager.Cast(spell, onUnit(ret)))
какой "object ret" мы передаем в анонимный метод?
Ну реально не могу въехать в эти делегаты
0
Эксперт .NET
5454 / 4227 / 1208
Регистрация: 12.10.2013
Сообщений: 12,219
Записей в блоге: 2
05.08.2014, 20:41 8
Цитата Сообщение от gerrus Посмотреть сообщение
какой "object ret" мы передаем в анонимный метод?
Это просто параметр типа object, а назвали его так, наверное, по прихоти писавшего код... Можно назвать как угодно (изменив имя этого параметра дальше в коде).
И да, может вы все-таки весь код покажете, а не кусочками...
0
5 / 5 / 3
Регистрация: 09.02.2014
Сообщений: 58
05.08.2014, 21:38  [ТС] 9
Да показал бы, только для этого нужна библиотека , да и код не мой (хотя лежит в открытом виде).
Я только стараюсь понять и написать свой вариант. Таким образом увеличить знания (которых пока очень мало) C#.
Всё это делается ради интереса и хобби

Кликните здесь для просмотра всего текста
кому интересно, речь идет о Honorbuddy и Combat Routines
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
06.08.2014, 17:35 10
Лучший ответ Сообщение было отмечено gerrus как решение

Решение

gerrus, мы имеем некоторый класс Decorator, который в качестве первого параметра принимает анонимную функцию в качестве первого параметра и объект Sequence вторым.
первый параметр представлен в виде лямбда-выражения, которое в свою очередь уже использует делегат UnitSelectionDelegate.
почитав что такое лямбда-выражения вы поймете, что ret это лишь параметр анонимного метода.

Добавлено через 31 минуту
попробую побыть шаманом и угадать что это и для чего это надо.
у нас есть метод ForseCast и Cast, которые возвращают объект Composite. но метод возвращает объект Decorator - а это уже похоже шаблон проектирования.
Судя по названиям методов делаем предположение, что это какая-то игра и это методы вызова заклинаний.
Далее проводим цепочку и понимаем, что игра без графики сейчас не игра, то есть, скорее всего,эти методы возвращают некоторые объекты(команды) для графики.
Смотрим далее на параметры Decorator. Первый это проверка на ошибки. При этом проверку необходимо делать именно в момент вызова анимации. Однако для каждого действия нужна своя проверка. Именно потому первый параметр - это функция, а не результат вычисления. И в момент выполнения команда(Composite) выполнить функцию, которую создало именно само действие, а команде без разницы какое это действие и нет необходимости обращаться к самому действию и его объектам.
Рассмотрим зачем тут используется UnitSelectionDelegate. В данном случае используется целевое заклинание, а ведь может быть и заклинание по площади, или вовсе не заклинание, а взаимодействие с окружающей средой героя и цель воздействия необходимо определить именно в момент выполнения команды. Потому в данном случае мы видим на месте делегата простую передачу объекта, а в более сложном случае там будет функция, которая и вернет объект(ы) воздействия.
Второй это уже непосредственно метод, который должен выполниться этой командой, метод тоже создает само действие и команде без разницы каким объектом было выполнено.
2
5 / 5 / 3
Регистрация: 09.02.2014
Сообщений: 58
07.08.2014, 09:18  [ТС] 11
Learx, Спасибо! Более менее понял зачем там делегат!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2014, 09:18
Помогаю со студенческими работами здесь

Не работает сортировка в приведенном коде
что тут не так? #include &lt;iostream&gt; using namespace std; void en(int* a, int size); void...

Не правильно работает if в приведенном коде
Есть функция которая считает начало слова в строке(a - массив строк, b - массив...

Не работает сортировка в приведенном коде
Здравствуйте. У меня такая проблемка. Не работает сортировка... Вот часть кода сортировки,...

Как работает функция "test" в приведенном коде
Объясните как работает функция test #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #include...


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

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

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