Zastosowanie i deklaracja delegatów

0

Mam pewien problem. Zastanawiam się w jakiej sytuacji należy uciekać się do zastosowania delegatów w C#?
Czy dobrym zastosowaniem byłoby informowanie z poziomu klasy, zewnętrznej metody o stanie np odtwarzania muzyki? Dla przykładu załóżmy że mamy dwa zdarzenia: PlayLoop i Stop wtedy teoretycznie możemy zrobić tak:

 if (StopPlay)
                Stop(this,new MusicEvent("Player nie odtwarza"));
            else
            {
                PlayTime++;
                if (PlayTime != Time) 
                {
                    PlayLoop(this, new MusicEvent("Trwa odtwarzanie!"));

                } 

Korzystam tutaj przy okazji z klasy EventArgs.

Druga sprawa, słyszałem kiedyś że delegaty deklarujemy poza klasą. Jednak po pierwsze w moim przykładzie się to nie kompiluje a po drugie w moich źródłach papierowych są deklarowane w klasie:P

0

No przede wszystkim, to chyba o zdarzenia (event) Ci chodzi. Delegat to tylko wskaźnik na metodę, który określa jaką sygnaturę musi mieć metoda obsługująca dane zdarzenie.

using System;
using System.Threading;

namespace ConsoleApplication18
{
    class Program
    {
        static void Main(string[] args)
        {
            KoniecŚwiata noIDupa = new KoniecŚwiata();
            noIDupa.SzatanZaczyna += new SzatanDelegate(noIDupa_SzatanZaczyna);
            noIDupa.Start();
        }

        static void noIDupa_SzatanZaczyna(object sender, SzatanEventArgs e)
        {
            Console.WriteLine("Podnosimy temperaturę: {0}.", e.Temperatura);
        }
    }

    class SzatanEventArgs : EventArgs
    {
        public int Temperatura { get; set; }

        public SzatanEventArgs(int temperatura)
        {
            this.Temperatura = temperatura;
        }
    }

    delegate void SzatanDelegate(object sender, SzatanEventArgs e);

    class KoniecŚwiata
    {
        public event SzatanDelegate SzatanZaczyna;

        protected virtual void OnSzatanZaczyna(SzatanEventArgs e)
        {
            if (this.SzatanZaczyna != null)
            {
                this.SzatanZaczyna(this, e);
            }
        }

        public void Start()
        {
            Random rand = new Random();
            int t = 30;
            while (true)
            {
                t = rand.Next(t, 2 * t);
                this.OnSzatanZaczyna(new SzatanEventArgs(t));
                Thread.Sleep(500);
            }
        }

    }

}
0

@somekind
Dzięki za rozbudowany i pełen konkretów przykład ale ja pytałem KIEDY i ort! to stosować a nie JAK to stosować :|

0

Sorry, ale jak pytasz o zastosowanie delegatów, a piszesz o eventach, to człowiek dostaje lekkiego WTF. Kod miał za zadanie udowodnić, że delegaty można deklarować poza klasą, sam pisałeś, że masz z tym problem.

Kiedy stosujemy delegaty?

  1. Gdy potrzebujemy przekazać do funkcji inną funkcję jako jej argument.
  2. Przy definiowaniu zdarzeń - typ zdarzenia musi być delegatem.

Po co stosujemy delegaty?

  1. Żeby przekazać do funkcji inną funkcję jako jej argument.
  2. Żeby zdefiniować zdarzenie.

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