Da quanto ho osservato, i metodi che iniziano con la parola "On" si dividono in due categorie:
-
Una classe base che definisce un evento esporrà un metodo
protected
il cui nome inizia con "On" seguito dal nome dell'evento in modo che le classi derivate possano essere in grado di generare l'evento. -
Una classe base espone un metodo
protected virtual
oprotected internal virtual
il cui nome inizia con "On" che può essere sovrascritto dalle classi derivate che vogliono sostituire il comportamento predefinito di tale metodo.
# 1 è semplice e ragionevole per me. Non consentendo alla classe derivata di sovrascrivere il metodo, garantisce che l'evento verrà generato se e quando la classe derivata chiama il metodo.
# 2 mi lascia comunque in dubbio, perché non sono sicuro che l'evento associato o implicito nella classe base verrà mai generato a meno che il metodo sottoposto a override non chiamerà base.On...
. Nel caso protected internal virtual
, il metodo può anche essere chiamato da altre classi.
Un esempio di # 2 è Microsoft.EntityFrameworkCore.DbContext
: quando la generazione del codice produce automaticamente la tua classe derivata, ha due metodi: protected override void OnConfiguring
e protected override void OnModelCreating
. Nessuno dei due metodi chiama la classe base nei corpi generati. In questo caso, poiché sono protected
non protected internal
, la classe base deve chiamare questi metodi a un certo punto. Non sono sicuro se sia coinvolto anche un evento.
Un altro esempio di # 2 è System.Windows.Forms.Form
. Esistono molti metodi protected virtual
, ad esempio protected virtual void OnActivated
. La descrizione di tale metodo è "Solleva l'evento System.Windows.Forms.Form.Activated.", Ma ovviamente ciò accade solo se il metodo chiama base.OnActivated
.
Esiste una convenzione definitiva per l'utilizzo della parola "On" all'inizio di determinati nomi di metodi? Deve esserci sempre un evento coinvolto, e il nome dell'evento dovrebbe sempre essere usato dopo "On" nel nome del metodo? Se un evento è sempre associato a un metodo On...
, cosa possono assumere i client dell'API se non chiamano base.On...
quando eseguono l'override del metodo? Possono presumere che l'evento non verrà licenziato? Se quest'ultimo è vero, allora perché il codice generato automaticamente per Microsoft.EntityFrameworkCore.DbContext.OnConfiguring
e Microsoft.EntityFrameworkCore.DbContext.OnModelCreating
non chiama la classe base?