我有一个带有抽象方法的抽象类,这个类被 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
(但你会失去编译器的保护)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句