如何在超级类和子类的方法之间跳转

本文关键字:方法 之间 子类 | 更新日期: 2023-09-27 18:32:53

如果我有一个像状态机一样的类,Foo是这样的:

public class Foo
{
    public virtual State Update()
    {
        switch (CurrentState)
        {
            case State.Start:
                if (!WatingForData())
                    CurrentState = State.GotData;
                break;
            case State.GotData:
                if (something else)
                    ....
                break;
        }
        return CurrentState;
    }
}

处理一般步骤。

派生类 Bar 将具有另一个用于各个步骤的状态机这样:

public class Bar : Foo
{
    public override State Update()
    {
        switch (CurrentState)
        {
            case State.GetData:
                if (GotData())
                    CurrentState = State.GotData;
                break;
            case State.GotData:
                if (ProcessData())
                    CurrentState = base.State.GotData;
                break;
        }
        return CurrentState;
    }
}

我想实现这样的事情;

while(!Foo.State == State.Done)
{
    Thread.Sleep(10);
    Foo.Update()
}

程序首先转到 Bar.Update() 并处理所有单独的(子)步骤,完成后继续进入 Foo.Update()。

鉴于我当前的代码,我必须将 Foo 的状态更改为新的(而不是虚拟的)并做类似的事情;

while(!Foo.State == State.Done)
{
    Thread.Sleep(10);
    if(Bar.State == Bar.State.Done)
    {
        ((Foo)Bar).Update()
    }
    else
    {
        Foo.Update();    
    }
}

不知道我如何以更清洁的方式做到这一点。我想知道是否有更好的方法来处理具有子状态的状态机?如能举例说明,将不胜感激。

如何在超级类和子类的方法之间跳转

您可以更改Bar.Update以调用base.Update

public override State Update()
{
    // sub steps:
    switch (CurrentState)
    {
        case State.GetData:
            if (GotData())
                CurrentState = State.GotData;
            break;
        case State.GotData:
            if (ProcessData())
                CurrentState = base.State.GotData;
            break;
    }
    // proceed to Foo.Update:
    return base.Update();
}