我正在使用C#中的框架,该框架将依赖于作为继承基类的类实现的可插入组件。为了使组件尽可能简单,我正在研究一些奇怪的控制流程。
基类包括静态方法 RunStep(参数)。继承类多次调用此方法,并且每次调用它时都会检查条件。如果这个条件恰好是假的,我希望调用方法停止并返回。代码的简化工作版本是:
基类:
class MyBase
{
private static object RunStep(string parameter)
{
if(SomeFunction(parameter))
return SomeOtherFunction(parameter);
else
return null;
}
}
继承类:
class MyInheritor
{
public void Run()
{
object result = RunStep("mystring1");
if(null != result)
{
//perform some logic on result
result = RunStep("mystring2");
if(null != result){
//perform some different logic on result
RunStep("mystring3");
}
}
}
}
我想知道的是,是否可以在基类中执行某些操作,以便我可以将继承类简化为:
class MyInheritor2
{
public void Run()
{
object result = RunStep("mystring1");
//perform some logic on result
result = RunStep("mystring2");
//perform some different logic on result
result = RunStep("mystring3");
}
}
}
我会将参数放在一个列表中并循环遍历它们,但是每次调用RunStep方法后都需要发生逻辑,每次逻辑都不同。这需要从表中循环。另请注意,RunStep调用之间的逻辑访问结果上的属性,因此它在没有空检查的情况下崩溃。
这可能看起来像是一件微不足道的事情,但可能有成千上万的这些继承类并简化它们是一件大事。
答案 0 :(得分:3)
让基类控制执行流程:
class Base
{
private readonly List<Tuple<string, Action>> steps = new List<Tuple<string, Action>>();
protected void RegisterStep(string parameter, Action someLogic)
{
steps.Add(Tuple.Create(parameter, someLogic));
}
protected void Run()
{
foreach (var step in steps)
{
var result = RunStep(step.Item1);
if (result == null)
{
break;
}
// perform some logic
step.Item2();
}
}
private object RunStep(string parameter)
{
// some implementation
return null;
}
}
class Derived : Base
{
public Derived()
{
RegisterStep("1", () => { });
RegisterStep("2", () => { });
RegisterStep("3", () => { });
// etc
}
}
答案 1 :(得分:2)
没有办法让函数调用退出调用函数,除了抛出Exception
,你不应该这样做。
你可以做些什么来使你的代码更清洁是反转案件。
object result = RunStep("mystring1");
if (result == null) return;
result = RunStep("mystring2");
if (result == null) return;
result = RunStep("mystring3");
if (result == null) return;