2011-10-17 2 views
8

Cercavo solo di guardare la documentazione XNA per il Game class e ho notato che c'è un evento Deactivated e un metodo virtuale OnDeactived che è possibile sovrascrivere.Sovrascrivi il metodo virtuale o crea il gestore di eventi?

La creazione di un gestore eventi per l'evento Deactivated e l'annullamento del metodo virtuale OnDeactived consente al client di gestire il gioco perdendo la concentrazione.

Mi chiedevo quale approccio dovrebbe essere usato in generale per gestire il gioco perdendo la concentrazione. Creare un gestore di eventi o sovrascrivere il metodo virtuale? Ci sono differenze tra ogni approccio?

risposta

7

Ci sono due differenze evidenti:

  • È possibile sostituire solo OnDeactivated all'interno di una classe derivata da quella dichiarandolo - mero codice "altro" può utilizzare solo l'evento
  • All'interno OnDeactived, tocca a per decidere se chiamare o meno base.OnDeactivated - si potrebbe sopprimere efficacemente l'evento, o modificare i parametri; invocarla prima o dopo il proprio codice, ecc

Se sei già derivanti dalla classe, in entrambi i casi avrebbe funzionato - personalmente probabilmente sarei utilizzare l'evento il più delle volte, a meno che non ho voluto prendere qualsiasi altro tipo di azione che può essere eseguita solo eseguendo l'override. A prescindere da qualsiasi altra cosa, ciò rende il codice più portabile se si desidera spostarlo altrove. Poi di nuovo, in genere non sono un fan dell'ereditarietà, quindi sono di parte :)

+0

Grazie per la risposta rapida e accurata! –

+1

+1 se non altro per "Poi di nuovo, in genere non sono un fan dell'ereditarietà" –

1

La decisione se sovrascrivere il metodo o utilizzare il gestore di eventi spesso si riduce a quanto controllo è necessario avere su cosa succede durante l'esecuzione di quel metodo. L'override del metodo ti dà il pieno controllo del metodo, mentre il gestore eventi viene eseguito solo dopo l'esecuzione del metodo.

Se è necessario un alto livello di controllo su ciò che accade durante tale metodo, consiglierei di ignorare il metodo. Se hai semplicemente bisogno di eseguire del codice dopo l'esecuzione del metodo, utilizzerei il gestore di eventi.

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 
}