2011-10-17 19 views
8

Właśnie przeglądałem dokumentację XNA dla Game class i zauważyłem, że jest zdarzenie Deactivated, a metoda wirtualna OnDeactived może być nadpisana.Zastąp wirtualną metodę lub utwórz procedurę obsługi zdarzeń?

Zarówno tworzenie programu obsługi zdarzeń dla zdarzenia Deactivated i przesłonięcie metody wirtualnej OnDeactived pozwala klientowi obsłużyć grę tracąc fokus.

Zastanawiam się, które podejście powinno być ogólnie używane do radzenia sobie z przegraną w grze. Tworzenie procedury obsługi zdarzenia lub przesłanianie metody wirtualnej? Czy są jakieś różnice między każdym podejściem?

Odpowiedz

7

Istnieją dwa wyraźne różnice:

  • Można tylko przesłonić OnDeactivated w klasie pochodzącej od jednego uznającej go - tylko „inny” kod można wykorzystać tylko zdarzenie
  • ciągu OnDeactived, to do możesz zdecydować, czy chcesz zadzwonić pod numer base.OnDeactivated - możesz skutecznie wyłączyć zdarzenie lub zmienić parametry; powołać go przed lub po swoim własnym kodzie, itd

Jeśli jesteś już pochodzący z klasy, czy inaczej będzie działać - osobiście bym chyba użyć zdarzenia częściej niż nie, chyba że chciałem zabrać dowolne działanie, które można wykonać tylko przez nadpisanie. Pomijając wszystko inne, czyni to kod bardziej przenośnym, jeśli chcesz go przenieść gdziekolwiek indziej. Z drugiej strony, ogólnie nie jestem fanem dziedziczenia, więc jestem stronniczy :)

+0

Dzięki za szybką i dokładną odpowiedź! –

+1

+1, jeśli nie masz nic więcej niż na "Z drugiej strony generalnie nie jestem fanem spadku" –

1

Decyzja, czy zastąpić metodę, czy użyć funkcji obsługi zdarzeń, często sprowadza się do tego, ile kontroli trzeba mieć nad tym, co dzieje się podczas wykonywania tej metody. Zastąpienie metody daje pełną kontrolę nad metodą, podczas gdy procedura obsługi zdarzeń działa tylko po wykonaniu metody.

Jeśli potrzebujesz wysokiego poziomu kontroli nad tym, co dzieje się podczas tej metody, zaleciłbym nadpisanie tej metody. Jeśli po uruchomieniu metody wystarczy uruchomić jakiś kod, skorzystam z procedury obsługi zdarzeń.

protected override void OnDeactivated(EventArgs e) 
{ 
    //run some code before execution (anything that could effect execution) 

    //call the base method and fire the event 
    base.OnDeactivated(e); 

    //run some code after execution 
} 
Powiązane problemy