2012-05-28 16 views
6

Tengo un método base virtual void Action() que se reemplaza en una clase derivada.C#: retorno completo desde el método base

El primer paso en Acción es llamar al base.Action(). Si ocurre una situación en el método base, no quiero que se procese el resto del método derivado.

Quiero saber si hay una palabra clave o patrón de diseño que me permita salir del método derivado del método base.

Actualmente estoy buscando cambiar el vacío a bool y usarlo como un control de flujo, pero me preguntaba si hay otros patrones de diseño que pueda usar.

+0

No, no es una situación de error, por lo que las excepciones no funcionarán. – Talib

+0

Lo siento, gané (eliminé la publicación anterior sobre no necesitar una solución), todavía necesito una solución, el sistema se está volviendo bastante complejo. Básicamente, hay una variable de credits_available en otro lugar del código. Me gustaría poder deshabilitar todas las acciones en la clase base si no hay créditos disponibles. Me gustaría poder hacer esto sin que la clase derivada tenga que duplicar el código. – Talib

Respuesta

3

No lo utilice con void tipo devuelto, pero se puede hacer, por ejemplo 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; 
    } 
} 

O, si se trata de una situación excepcional, lanzar una excepción, al igual que otros sugieren.

+0

Esto es un poco complicado ya que expone una implementación innecesaria a un consumidor de la clase. – Slugart

+0

@Slugart: ¿de qué implementación estás hablando? – Tigran

+0

Disculpa significaba detalles de implementación: la acción ahora expone el hecho de que devuelve bool. ¿Qué significa eso para el consumidor de la clase derivada? – Slugart

3

¿Esto es una "situación" de error? Si es así, solo haz que arroje una excepción, y no capte la excepción dentro de la anulación.

Si no es una situación de error, entonces usar el tipo de devolución suena como una forma de avanzar, pero puede no ser adecuado para su contexto; no sabemos realmente lo que está tratando de lograr.

Otra opción es utilizar el template method pattern:

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

    protected abstract void DoConditionalAction(); 
} 

Si no desea que la clase base abstracta, se puede hacer que sea un método virtual protegido que no hace nada en la clase base y está anulado en la clase derivada donde sea apropiado. Tenga en cuenta que DoSomething es no virtual aquí.

Si ninguna de estas opciones parece apropiada, deberá proporcionarnos más información concreta sobre lo que está tratando de lograr.

0

Lanza una excepción en el método base. Saldrá de cada método que lo llamó, hasta que sea capturado.

+0

Lanzar una excepción en un método que se llama con frecuencia no es una buena idea. –

+0

@Mert: es una buena idea en una situación * excepcional *, pero es una mala idea para el flujo de control en ** la mayoría de los casos. – Tigran

+0

@Mert: Lanzar excepciones con frecuencia no es bueno, pero la excepción solo se produce cuando hay "una situación", como lo expresó el OP. Eso no ocurre cada vez que se llama al método, ya que el flujo normal es ejecutar el resto del código en el método derivado. – Guffa

Cuestiones relacionadas