2009-10-27 17 views
7

Non sono mai stato davvero in bilico con questa domanda: ma sarebbe un crimine terribile chiamare base.SomeMethod() condizionalmente in un metodo sottoposto a override?Chiamare condizionatamente un metodo di base sovrascritto in C#

Esempio come in:

protected override void SomeMethod() 
{ 
    if(condition > 0) 
     base.SuperMethod(); 
} 

Sono consapevole che questo può essere considerato una cattiva pratica, ma in realtà non ho mai letto una tale affermazione finora.

risposta

10

Non riesco a pensare a una ragione per cui questo sarebbe male in cima alla mia testa.

Sarebbe molto peggio sovrascrivere il metodo di base e copiare la funzionalità del metodo di base per chiamare in modo condizionale invece di chiamare semplicemente il metodo di base.

7
class HardHearingPerson : Person 
{ 
    override void Listen() 
    { 
    if (volume.Acceptable()) 
     base.Listen(); 
    } 
} 

Indovina dipende dal contesto, ma sono sicuro che avrebbe potuto giustificare l'utilizzo.

2

Lo faccio abbastanza spesso. Ogni volta che ho bisogno di "fare qualcosa di più" in un metodo che sovrascrivo faccio le mie cose e invoco il metodo di base (o viceversa)

+0

Ti manca la parte "condizionata"? – leppie

+0

@leppie: No. Il "fare qualcosa di più" può includere condizionali – Sergio

1

Penso che sia totalmente accettabile. Potresti voler sovrascrivere il comportamento di un metodo di classe base solo in determinate circostanze, oppure estendere il comportamento chiamando il metodo di base e poi facendo le tue cose.

+0

Questo potrebbe giustificare un'altra classe (specializzazione) :) – leppie

+0

@leppie - non eredita un conteggio di classe come creare un'altra classe? Prendi questo esempio: class CSharpProgrammer eredita la classe Programmer ... CSharpProgrammer è una classe specializzata basata su Programmer. –

1

classi dovrebbero essere designed for inheritance:

Se la classe base è stato progettato in un modo in cui chiamare le versioni di base di alcuni metodi è opzionale allora è ok per omettere quelle chiamate.

Se la classe base è stato progettato in un modo in cui le versioni di base deve essere chiamato allora non è ok per omettere loro.

discute se si tratta di una "buona pratica" non coglie il punto, a mio parere. Il modo in cui una classe è strutturata per ereditarietà si basa sul suo scopo e design. La decisione di se i voi MAGGIO o MUST versioni base chiamata di un metodo è parte delle classi interfaccia pubblica, per quanto riguarda l'ereditarietà.

Non è possibile decidere quando è desiderabile o non desiderabile chiamare un metodo di classe base quando si esegue l'override senza comprendere come viene progettata la classe base e quale scopo viene utilizzato da ciascun metodo.

+1

Ecco perché 'sealed' dovrebbe essere l'impostazione predefinita in C#; o, per lo meno, essere in grado di mettere "base" dove può essere "sigillato". –

Problemi correlati