2012-05-28 9 views
6

Ho un metodo di base virtuale void Action() sovrascritto in una classe derivata.C# - Ritorno completo dal metodo di base

Il primo passo in azione è chiamare base.Action(). Se si verifica una situazione nel metodo base, non voglio che il resto del metodo derivato venga elaborato.

Voglio sapere se esiste una parola chiave o un motivo di progettazione che consentirà di uscire dal metodo derivato dal metodo derivato.

Attualmente sto cercando di cambiare il vuoto in bool e di usarlo come controllo di flusso, ma mi chiedevo se ci fossero altri schemi di progettazione che potrei essere in grado di utilizzare.

+0

No, non si tratta di una situazione di errore, quindi le eccezioni non funzioneranno. – Talib

+0

Scusa il guadagno (cancellato il post precedente di non aver bisogno di una soluzione), ho ancora bisogno di una soluzione, il sistema sta diventando piuttosto complesso. Fondamentalmente c'è una variabile credits_available da qualche altra parte nel codice. Mi piacerebbe essere in grado di disabilitare tutte le azioni nella classe base se non ci sono crediti disponibili. Mi piacerebbe essere in grado di farlo senza che la classe derivata debba duplicare il codice. – Talib

risposta

3

Non utilizzare con void tipo restituito, ma può fare, dire bool

public class Base 
{ 
    public virtual bool Action() 
    { 
     .. 
     return boolean-value. 
    } 
} 

public class Child : Base 
{ 
    public override bool Action() 
    { 
     if(!base.Action()) 
     return false; 

     .... 
     return boolean-value; 
    } 
} 

Oppure, se questa è una situazione eccezionale, sollevare un'eccezione, come altri suggeriscono.

+0

Questo è un po 'complicato in quanto espone un'implementazione non necessaria a un consumatore della classe. – Slugart

+0

@Slugart: di quale implementazione stai parlando? – Tigran

+0

Scusa significava dettagli di implementazione - L'azione ora espone il fatto che restituisce bool. Cosa significa questo per il consumatore della classe derivata? – Slugart

3

Si tratta di un errore "situazione"? In tal caso, è sufficiente creare un'eccezione e non rilevare l'eccezione all'interno dell'override.

Se non si tratta di una situazione di errore, l'uso del tipo di ritorno sembra un modo per andare avanti, ma potrebbe non essere adatto al contesto in cui si trova: non sappiamo davvero cosa si sta cercando di ottenere.

Un'altra opzione è quella di utilizzare il template method pattern:

public abstract class FooBase 
{ 
    public void DoSomething() 
    { 
     DoUnconditionalActions(); 
     if (someCondition) 
     { 
      DoConditionalAction(); 
     } 
    } 

    protected abstract void DoConditionalAction(); 
} 

Se non si vuole fare la classe astratta di base, si potrebbe rendere un metodo virtuale protetta che non fa nulla nella classe base e viene sovrascritto nella classe derivata, ove appropriato. Si noti che DoSomething è non virtuale qui.

Se nessuna di queste opzioni sembra appropriata, è necessario fornirci informazioni più concrete su ciò che si sta tentando di ottenere.

0

Lanciare un'eccezione nel metodo di base. Uscirà da ogni metodo che lo ha chiamato, fino a quando non viene catturato.

+0

Lanciare un'eccezione in un metodo chiamato frequentemente non è una buona idea. –

+0

@Mert: è una buona idea in * situazione * eccezionale, ma è una cattiva idea per il controllo del flusso in ** casi ** più. – Tigran

+0

@Mert: le eccezioni di lancio di frequente non sono buone, ma l'eccezione viene lanciata solo quando c'è "una situazione", come ha detto l'OP. Ciò non accade ogni volta che viene chiamato il metodo, poiché il flusso normale è eseguire il resto del codice nel metodo derivato. – Guffa