如何超载协同程序?

时间:2017-05-31 17:07:08

标签: c# unity3d

我有静态方法:

public static Init( IEnumerator param)
{
   Box box = InitBox();
   box.StartCorountine(param??)       
}

我想将param作为动作传递给StarCorountine,如何向IEnumerator参数添加参数?

我有2个方法,我想在Init静态方法中调用其中一个,我不知道如何将方法作为参数传递。

private IEnumerator test1()
{
 ...
}

private IEnumerator test2(int i, int ii, ReferenceType t)
{
 ...
}

好吧,让我们说这个盒子只是MonoBehaviour类,从预制件初始化。

 private static IEnumerator Wait(Box box, float time)
        {
            yield return new WaitForSeconds(time);
            box.Open();
                yield return new WaitForSeconds(time);
                    box.Close();
                   yield return new WaitForSeconds(time);

            DestroyObject(box.gameObject);

        }

我通常在Init StartCorountine上使用Wait方法,但现在我必须在关闭后添加一个动作,我想在Init StartCorountine上重载方法

1 个答案:

答案 0 :(得分:2)

Init(test1()); 是作为协程运行的方法的 return 值,而不是方法本身

根据您的示例代码,这是一个有效的调用:

test1()

为什么不是,你正在调用Init(),它会产生并返回一个值,你将该值传递给StartCoroutine(),然后传递给test1(),没错。 Init()的其余部分将在以后正常调用。

如果您要执行的操作是将方法参考传递给StartCoroutine(param()); ,并且您希望这样做:

public delegate void MyDelegate();

void someFunc() {
    MyDelegate p = test1;
    Init(p);
}

public IEnumerator test1() {
    ...
}

public static void Init(MyDelegate param) {
    ...
    StartCoroutine(param());
}

你做不到。好吧,不是你想要的方式。

Delegates确实存在并且将覆盖传递方法引用,但是委托是严格类型的,并且不支持您似乎想要具有的变体行为。我不确定任何语言都会支持你在这种情况下尝试做的事情。如果您想要一个严格定义的委托,请确保:

test2(...)

但请注意,这根本不包括Init()。这是因为test2具有与test1不同的参数,并且需要单独的委托,并且委托不遵循继承规则,它们是严格类型:所有参数必须完全声明(没有泛型 1 )并且不能相互继承。要支持test2,您必须编写一个第二个 int i, int ii, ReferenceType t方法,该方法接受一个具有三个参数public delegate void MyDelegate(<T> obj);的委托,所有参数都已声明。

1 Unity在.NET 2.0上运行,如果我没记错的话,协方差和逆变(允许像$(this).siblings('.panel-heading').find('.count-checked-checkboxes') 这样的功能的东西)直到4.0才被添加到.NET框架中。可能已经3.5了。

Unity 2017更新为在.NET 3.5上运行(提供.NET 4.6实验)并且应该能够在通用定义中进行协方差和逆变,尽管我自己还没有对它进行过探索。