Eventy, handlery i wiecej

0

Witam! Czytając kod naszych zagranicznych kolegów zauważyłem, że:

Powiedzmy w klasie Client.cs jest taki kod:

 public event CommandsEvents.CommandReceivedHandler CommandReceived;

gdzieś dalej:

        protected virtual void OnCommandReceived(CommandEventArgs e)
        {
            if (CommandReceived != null)
            {
                CommandReceived(this, e);
            }
        }

} 

a później w funkcji odbierania wiadomości po odebraniu wiadomości wywołane jest:

OnCommandReceived(this, cmdEvArg) 

Następnie w innej klasie, która korzysta z klasy Client.cs
mamy przypisanie handler'a do event'u powiedzmy, że:

client.CommandReceived += new CommandEvents.CommandReceivedHanlder(CommandReceived_Handler); 

i funkcja CommandReceived_Handler jest prywatna.

Teraz moje pytania:1. czy ten kod jest poprawny? 2. Po co robić OnCommandReceived virtualne skoro tam i tak jest tylko sprawdzanie eventu i jego odpalenie(ktoś mogłby ją nadpisać i event wgl by nie odpalił? 3. I to nie jest handler tego event'u? ( 4. handler to ta funkcja, która dla eventu jest odpalana)? 5. Czy funkcja CommandReceived_Handler nie powinna być własnie virtualna? Żeby klasa po niej dziedzicząca mogła zmienić co chce w niej zrobić? Chyba, że wykluczamy późniejsze użycie tak ? Z góry dziękuję za odpowiedź!

0
  1. Nie wstawiłeś całego kodu, więc ciężko stwierdzić.
  2. A jeśli ktoś w przyszłości zechce dodać inny warunek niż ten, który podałeś wyżej do innej klasy dziedziczącej?
  3. CommandReceived_Handler to tak jak Button1_Click więc czemu ma być wirtualna?

3 i 4 pytania nie zrozumiałem.

Najlepiej jak przećwiczysz zdarzenia i delegaty.

0

Tylko jak będziemy dziedziczyć po tej klasie, w której mamy ten CommandReceivedHandler, i ktoś będzie chciał zmienić reakcję na event CommandReceived?

0

nie rozumiem o czym mówisz. Metodą która sprawdza event jest "OnCommandReceived(CommandEventArgs e)" natomiast metodę "CommandReceived_Handler" możesz umieścić w klasie, 1...entej i będzie działała tak jak ją sobie skonstruujesz, przypisując w taki sam sposób ją do eventu jak przedstawiłeś.

0

No tak, ale napisałem, że jeżeli dziedziczymy w tej klasie gdzie jest ten CommandReceived_Handler i on jest przypisany już do eventu i w jakiejs konkretnej sytuacji zostanie odpalony. A gdy bede dziedziczył po tej klasie to w tej sytuacji on zostanie odpalony. Jak dodam inny, jakiś handler do tego eventu w klasie dziedziczącej to odpali CommandReceived_Handler i ten inny z tego co rozuemiem tak ?

0

Procedura obsługi zdarzenia zostaje podpięta pod zdarzenie najczęściej w konstruktorze. W związku z tym nie ma sensu, żeby procedura obsługi była inna niż prywatna. Ewentualnie w klasie pochodnej definiujesz kolejną procedurę obsługi i podłączasz ją do łańcucha zdarzeń.

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