3

我正在使用 C# 开发一个框架,该框架将依赖于实现为继承基类的类的可插入组件。为了使组件尽可能简单,我正在研究一些奇怪的控制流。

基类包含一个静态方法RunStep(parameter)。该方法被继承类多次调用,每次调用都会检查一个条件。如果这个条件恰好为假,我希望调用方法停止并返回。代码的简化工作版本是:

基类:

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 调用之间的逻辑访问结果的属性,因此它在没有空检查的情况下崩溃。

这似乎是一件微不足道的事情,但可能有成千上万个这样的继承类,简化它们是一件大事。

4

2 回答 2

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
    }
}
于 2013-05-07T19:30:49.473 回答
2

没有办法让函数调用退出调用函数Exception,除了抛出一个你不应该做的事情。

可以做些什么来让你的代码更干净,就是反转大小写。

 object result = RunStep("mystring1");
 if (result == null) return;

 result = RunStep("mystring2");
 if (result == null) return;

 result = RunStep("mystring3");
 if (result == null) return;
于 2013-05-07T19:19:01.607 回答