Chiama la base allinterno del metodo sovrascritto

So che ci sono domande sulla chiamata del metodo base allinterno di un metodo sovrascritto come questo . Ma cosa succede se un metodo sottoposto a override chiama solo la classe base? Questo è cattivo / buono degnato? Sembra strano, perché sovrascrivere un metodo solo per chiamare comunque la base?

Ad esempio, vedere:

public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } } 

Commenti

  • Non serve a nulla e ingombra solo il codice, quindi eliminalo.
  • @DavidArno che ' è quello che pensavo anchio, assicurandomi solo che non ci fosse ' motivo prima di farlo
  • In un mondo ideale, lapp sarà coperta da unit test, quindi è possibile rimuoverlo e quando tutti i test sono ancora superati, ' sapevi che ' non era necessario. Tuttavia, non ' viviamo sempre in quel mondo ideale, quindi è stato ragionevole chiedere 🙂
  • Lunico motivo per cui ' lascerei il codice simile a quello sopra se ci fosse più codice nel metodo sovrascritto in passato, e fosse stato rimosso, ma potesse essere visualizzato attraverso le vecchie versioni nel sistema di controllo del codice sorgente. Lasciare un artefatto nel codice corrente come questo potrebbe segnalare allo sviluppatore oggi di visualizzare la cronologia del file ' per la versione precedente del metodo.

Answer

Ma cosa succede se un metodo sovrascritto chiama solo la classe base? Questo design è cattivo / buono?

design cattivo? No, piuttosto cattiva implementazione. È fuorviante per il programmatore di manutenzione. Quando non vedo un override, so che viene chiamata la base. Un override mi dice che cè qualcosa di diverso, anche se la base viene chiamata anche lì.


Richiedere un override per chiamare la base senza un modello è cattivo design

Thread di riferimento – risposta più popolare

La mia reazione iniziale alla sostituzione scandinava il modello è: CODING HORROR! Sembra che io sia costretto a leggere tutto questo, e anche di più, per assicurarmi che il “sottocomportamento” non interrompa il mio codice e viceversa.

Il Template Method Pattern è un buon modo per esprimere il codice variabile allinterno di un flusso di codice più ampio e garantire un corretto ordine di esecuzione.

Nella mia esperienza è così tipico che una sottoclasse debba sapere quali metodi dichiarati di base chiamare e in ordine. Prendi una manciata di sottoclassi tutte con la stessa struttura di controllo taglia e incolla, aggiungi 5 anni di manutenzione; ora capisci perché preferisco 101 proof Wild Turkey .

P.S. Tutto questo è uno dei motivi principali per cui mi scontro con luso eccessivo di interface al posto delle abstract classi.

Commenti

  • Luso eccessivo di interfacce in C # molto probabilmente deriva dal non voler incatenare limplementatore a quella specifica classe base astratta. Luso di uninterfaccia consente allimplementatore di implementare unaltra classe base, e non solo quella specifica classe astratta. Tuttavia, dipende molto dalle circostanze. Trovo una buona pratica sia avere uninterfaccia IFoo e una classe FooBase, che implementa il IFoo interfaccia, con chiamate di metodo astratte per i metodi e proprietà automatiche per gli oggetti di scena. Magari inserisci anche un ctor.

Rispondi

IMO, virtual, nella classe base, hanno unimplementazione molto semplice. Anche se override la definizione del metodo virtual nella classe figlia, possiamo comunque chiamare virtual (con implementazione di base) sebbene abbia senso e non influenzi il comportamento previsto del metodo overridden nella classe figlia.

Ad esempio, BaseCalculator fa il vero lavoro. Calcolatrice sta decorando la libreria BaseCalculator estendendola.

public class BaseCalculator { public virtual T Add<T>(T number01, T number02) { return number01 + number02; } } public class Calculator: BaseCalculator { public override T Add<T>(T number01, T number02) { Console.WriteLine(number01 + " | " + number02); var result = base.Add<int>(1, 3); Console.WriteLine("Result: "+ result); return result; } } 

D: Cosa succede se un metodo sostituito chiama solo la classe base?

A: Nel tuo caso, avere il metodo della classe base come virtual, non è necessario override fino a quando non vogliamo modificarne il comportamento.

D: Questo è cattivo / buono degnato?

A: Sì, potrebbe essere progettato male in quanto potrebbe ingombrare il file del codice sorgente mentre aggiungiamo sostituzioni non necessarie.

D: Sembra solo strano, perché sovrascrivere un metodo solo per chiamare comunque la base?

A: BaseCalculator fa il vero lavoro . Calculator sta decorando la libreria BaseCalculator estendendola.

Spero che sia daiuto!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *