C # design per forzare il metodo virtuale da chiamare dall'override, o qualcosa di simile

2

Possiamo fare qualcosa del genere:

// in base class
protected virtual void Init(){
   //do stuff that all objects need to do
}

//in derived class
protected override void Init(){
   base.Init(); // if you forget this but it compiles all hell breaks loose
   //do derived stuff related to this object
}

Ho trascorso 15 minuti buoni con un errore logico perché ho semplicemente dimenticato la chiamata di base init.

Ma non c'è nessuna parola chiave da "richiedere" o forzare contrattualmente il metodo derivato a chiamare l'equivalente di base. Quindi se ti dimentichi, avrai dei brutti momenti in alcuni casi in cui dovrai chiamare la base. O altre volte in cui chiami base e la classe derivata non ne ha bisogno perché sovrascrive tutti i valori di base piuttosto che alcuni di essi.

Esiste un modo per renderlo più robusto / rigoroso in modo tale che tale dimenticanza non si verifichi.

    
posta WDUK 24.07.2018 - 04:41
fonte

1 risposta

9

Perché lo stesso effetto potrebbe essere già raggiunto da uno schema standard di sovrascrivibili vuoti.

Se tutti i tuoi metodi non sigillati hanno un corpo vuoto, non importa se vengono chiamati dal metodo sovrascritto. Utilizza il modello di modello di metodo per sigillare l'implementazione e lascia solo i metodi vuoti esposti per l'override:

public sealed override void callMe() {
     before();
     overrideMe();
     after();
}

protected virtual void overrideMe() {
   // left empty to be optionally implemented in children
}

Sigilla metodi con chiamate obbligatorie e implementor non sarà in grado di aggirarli.

    
risposta data 24.07.2018 - 05:40
fonte

Leggi altre domande sui tag