Delegaty, Multicast

0

Mam dośyć trywialne pytanie, czemu gdy delegat (działanie) wywołuje wszystkie metody.
To konsola wyświetli Mnozenie, Dodaj, Odejmij, -45. A nie wyświetli wartości zwarcanych przez metody Mnożenie oraz Dodaj.

using System;

namespace Program
{
    class Program
    {
        
        delegate int Delegat(int x, int y);

        static void Main(string[] args)
        {
            
            int liczbaX = 10;
            int liczbaY = 55;


          
            Delegat dzialanie = Dodaj;
            dzialanie += Mnozenie;
            dzialanie += Odejmij;


            Console.WriteLine("Wynik  {0}", dzialanie(liczbaX, liczbaY));

            Console.ReadKey();
        }

        static int Mnozenie(int x, int y)
        {
            Console.WriteLine("Mnozenie");
            return x * y;
        }
        static int Dodaj(int x, int y)
        {
            Console.WriteLine(Dodaj");
            return x + y;
        }
        static int Odejmij(int x, int y)
        {
            Console.WriteLine("Odejmij");
            return x - y;
        }
    }
}
2

tutaj nie jestem pewien @somekind @katelx powinni widziec lepiej, ale wydaje mi sie, ze delegat moze zwrocic tylko jedna rzecz. Bo jezeli zwroci trzy obiekty, to do czego ma to byc przypisane? Jak to ma dzialac?

Rozwiazaniem na to jest

  1. nie posiadanie delegatu ktory posiada wszystkie funkcje
  2. dodanie callbacku do delegatu, ktory bedzie zawieral rezultat
1

No tak, może zwrócić tylko jedną rzecz - z ostatnio przypisanej metody.

0

a co chcesz osiagnac? wypisac wyniki roznych dzialan? to zmien troche na:

using System;

namespace Program
{
    class Program
    {

        delegate void Delegat(int x, int y);

        static void Main(string[] args)
        {

            int liczbaX = 10;
            int liczbaY = 55;

            Delegat dzialanie = Dodaj;
            dzialanie += Mnozenie;
            dzialanie += Odejmij;

	dzialanie(liczbaX, liczbaY);

            Console.ReadKey();
        }

        static void Mnozenie(int x, int y)
        {
            Console.WriteLine("Mnozenie  {0}", x * y);
        }
        
        static void Dodaj(int x, int y)
        {
            Console.WriteLine("Dodaj  {0}", x + y);
        }
        
        static void Odejmij(int x, int y)
        {
            Console.WriteLine("Odejmij  {0}", x - y);
        }
    }
}
1

Delegaty nie służą do łączenia wywołań funkcji w łańcuchy.

Spróbuj raczej tak:

var dzialania = new List<Func<int, int, int>> { Dodaj, Mnozenie, Odejmij };
int wynik = dzialania.Aggregate(0, (total, func) => func(liczbaX, liczbaY));
Console.WriteLine("Wynik  {0}", wynik);
2

Jeśli dany delegat zawiera wskazania na wiele metod i chcemy dostać wszystkie rezultaty a nie tylko ostatni to możemy je wywołać w dokładnie takiej kolejności w jakiej zostały dodane w ten sposób:

 foreach(Delegat d in dzialanie.GetInvocationList())
 {
     Console.WriteLine("Wynik  {0}", d(liczbaX, liczbaY));
 }

zamiast

Console.WriteLine("Wynik  {0}", dzialanie(liczbaX, liczbaY));
0

Dzięki za odpowiedzi, teraz już wiem :). Akurat to był tylko przykład składania delegatów, interesowało mnie, czemu delegat zwraca tylko wartość ostatnio dodanej metody.

1 użytkowników online, w tym zalogowanych: 0, gości: 1