封装多步计算的最优雅方法是什么?

时间:2014-07-08 22:20:20

标签: c# encapsulation coroutine yield-return

作为一个更具体的例子 - 我有一个游戏循环,我希望有一个方法来处理动画。

为了这个例子,这个动画是对运动功能的调用。

有没有一种方法可以调用这个功能并让它做...当动画自动完成时?

更基本的实现是让它在完成时返回一个值,并让调用者不断检查这一点,但我似乎记得有更优雅的技巧。

我对协同例程或yield关键字一无所知。他们可能在这里有关系吗?

2 个答案:

答案 0 :(得分:3)

答案主要是:取决于

如果代码是,正如你所说,一个简单的方法调用(你无法控制),并且该方法调用正在循环中运行(而不是长时间运行),你几乎被卡住了使用"检查返回值"方法

如果它只是一个功能,但是长时间运行,你可以传递一个回调。您的功能签名变为:

public void foo MyFunc(Action callback)
{
   ...
   callback();
}

您可以使用Action委托来调用它(当然,只要您更新函数签名,任何其他委托都可以。)操作完成后,foo将调用回调。这通常在线程环境中完成,因为您可以等待调用在单个线程上返回。

在线程环境中,如果线程终止与您的"完成"一致,您也可以等待线程Join。条件。

在最好的情况下,此功能被封装到一个类中,该类管理循环方法调用之间的状态。在这种情况下,您可以简单地引发一个使用类在操作完成时注册的事件。

最后一个是最详细的选项,但允许循环调用(如在游戏循环中)或线程,并且可以在完成时调用多个函数。如果在您的用例中有意义,我会选择此选项。

答案 1 :(得分:0)

如果您希望函数在完成时执行某些操作,请尝试使用回调:http://en.wikipedia.org/wiki/Callback_(computer_programming)

看起来像是:

public void Animate(Function foo)
{
    // Animate
    foo();
}