繁体   English   中英

派生类中的重写方法

[英]Overridden method in derived class

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

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

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

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

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

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

注意:您必须将所有对FunctionCall调用替换为FunctionCallWithCheck (在使用所有这些类的代码中)。
当然,仅当您调用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 (但您将失去编译器的保护)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM