派生类中的重写方法

AjS

我有一个带有抽象方法的抽象类,这个类被 100 多个其他类继承,我们在这些类中重写了这个虚拟方法。
现在业务需求略有变化,我们需要在调用覆盖的方法之前进行检查。我知道我可以检查 100 个类中的每一个,但这似乎不是一种优雅的方式,在所有派生类中都需要进行更改。

有没有更好的方法来处理这种变化?

public abstract class BaseFunction
{
    public abstract Result FunctionCall();
}

public class Function1 : BaseFuction
{
    public override Result FunctionCall()
    {
        //business logic
    }
}
繁荣

您可以将包装器方法添加到您的基类FunctionCallWithCheck中,例如执行检查,然后调用原始抽象方法FunctionCall

为了自定义检查,我将它放在具有默认实现的虚拟方法中,您可以在派生类中覆盖(如果需要)。

注意:您必须将所有, 的调用替换为(在使用所有这些类的代码中)。当然,仅当您呼叫的地方不多(您没有提供有关信息)时,这才是一个好方法。FunctionCallFunctionCallWithCheck
FunctionCall

public abstract class BaseFunction
{
    // Default check. You can override it in derived classes if needed.
    public virtual bool Check()
    {
        return true;    // put your conditions here
    }

    public int FunctionCallWithCheck()
    {
        if (Check())
        {
            return FunctionCall();
        }
        return -1;
    }

    protected abstract int FunctionCall();
};

public class Function1 : BaseFunction
{
    protected override int FunctionCall()
    {
        //business logic
        return 1;
    }
};

我将返回类型替换为,int因为您没有提供Result. 我假设它有一些默认值,以防不满足调用条件FunctionCall(而不是-1我用于此的值)。

更新:
正如@KlausGütter 评论的那样,您可以将FunctionCall其制成一个protected方法(而不是public),以便在您不小心调用它而不是FunctionCallWithCheck. 我在上面更新了我的代码。
如果你不想因为派生类很多而改变它,你也可以保留它public(但你会失去编译器的保护)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章