7

我有一个void Action()在派生类中被覆盖的虚拟基方法。

Action 的第一步是调用base.Action(). 如果基本方法中发生某种情况,我不希望处理派生方法的其余部分。

我想知道是否有一个关键字或设计模式可以让我从基方法中退出派生方法。

目前我正在考虑将 void 更改为 bool 并将其用作流控制,但我想知道是否还有其他设计模式可以使用。

4

3 回答 3

5

这是错误的“情况”吗?如果是这样,只需让它抛出异常,并且不要在覆盖范围内捕获异常。

如果这不是错误情况,那么使用返回类型确实听起来像是一种前进的方式,但它可能不适合您的上下文 - 我们真的不知道您想要实现什么。

另一种选择是使用模板方法模式

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

    protected abstract void DoConditionalAction();
}

如果您不想使基类抽象,则可以将其设为受保护的虚拟方法,该方法在基类中不执行任何操作,并在适当的情况下在派生类中被覆盖。注意DoSomething这里不是虚拟的。

如果这些选项听起来都不合适,您需要向我们提供有关您要实现的目标的更具体信息。

于 2012-05-28T09:06:46.870 回答
3

不要将它与 void返回类型一起使用,但可以这样做,比如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;
    }
}

或者,如果这是一个例外情况,请提出一个例外,就像其他人建议的那样。

于 2012-05-28T09:10:01.003 回答
0

在基本方法中抛出异常。它将退出调用它的每个方法,直到它被捕获。

于 2012-05-28T09:07:40.500 回答