C#-从基本方法完全返回

C#-从基本方法完全返回,c#,inheritance,methods,base,derived,C#,Inheritance,Methods,Base,Derived,我有一个虚拟基方法void Action(),它在派生类中被重写 操作的第一步是调用base.Action()。如果在基本方法中发生情况,我不希望处理派生方法的其余部分 我想知道是否有一个关键字或设计模式允许我从基本方法中退出派生方法 目前,我正在考虑将void更改为bool并将其用作流控制,但我想知道是否还有其他设计模式可以使用。这是一个错误的“情况”吗?如果是这样,就让它抛出一个异常,而不要在覆盖中捕获异常 如果这不是一个错误情况,那么使用返回类型听起来确实是一个前进的方向,但它可能不适合您

我有一个虚拟基方法
void Action()
,它在派生类中被重写

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

我想知道是否有一个关键字或设计模式允许我从基本方法中退出派生方法

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

这是一个错误的“情况”吗?如果是这样,就让它抛出一个异常,而不要在覆盖中捕获异常

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

另一种选择是使用:

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


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

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

不要将它与
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;
    }
}

或者,如果这是一种异常情况,请像其他人建议的那样引发异常。

在频繁调用的方法中引发异常不是一个好主意。@Mert:在异常情况下引发异常是一个好主意,但在大多数情况下,对控制流来说是一个坏主意。@Mert:频繁引发异常不好,但是,正如OP所说,只有在出现“情况”时才会抛出异常。这并不是每次调用该方法时都会发生,因为正常的流程是在派生方法中运行其余的代码。@Guffa:“情况”在这种情况下不是错误。“目前我正在考虑将void改为bool,并将其用作流量控制”他正在寻找一种在流量控制中使用void的方法,流量控制条件即使不是每次都会发生,也是非常频繁的。@Guffa:这就是我的解释?您如何解释“不,这不是一个错误情况,因此异常将不起作用–Talib”?讨论结束。这有点混乱,因为它向类的使用者公开了一个不必要的实现。@Slugart:你说的是什么实现?对不起,是指实现细节-操作现在公开了它返回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;
    }
}