2017-05-31 57 views
-4

我有靜態方法:如何重載協程?

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

我想通過PARAM作爲行動StarCorountine,如何將參數添加到IEnumerator的PARAM?

我有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); 

     } 

我通常使用在初始化StartCorountine wait方法,但現在我必須關閉後添加一個動作,我想在初始化StartCorountine

+0

'param'是'IEnumerable'還是'IEnumerator'? – FortyTwo

+1

你的問題不清楚。請編輯並重新編輯它。你還應該發佈'Box'類。 – Programmer

回答

2

一個IEnumerator重載方法是一種方法的返回值正在運行的協程,而不是方法本身

這是按照您的示例代碼的有效電話:

Init(test1()); 

爲什麼不是這樣,你調用test1(),它會產生並返回一個值,您將該值傳遞給Init(),然後將其傳遞給StartCoroutine(),這裏沒有錯。 test1()的其餘部分將在正常情況下稍後調用。

如果你想要做的是通過一個方法參考Init()並且要做到這一點:

StartCoroutine(param()); 

你不能。那麼,不是你想要的方式。

Delegates確實存在,並且會涵蓋傳遞方法引用,但委託是嚴格鍵入的,並且不支持您似乎想要的那種變體行爲。我不確定任何語言都會支持你在這種情況下要做的事情。如果你想有一個嚴格定義的委託,請務必:

public delegate void MyDelegate(); 

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

public IEnumerator test1() { 
    ... 
} 

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

但是注意一下這並不能掩蓋test2(...)可言。這是因爲test2與test1有不同的參數,並且需要一個單獨的委託,並且委託不遵循繼承規則,它們是嚴格鍵入:所有參數必須完全聲明(無泛型),並且不能繼承從彼此。爲了支持test2,你必須編寫一個第二個Init()方法,該方法使用三個參數int i, int ii, ReferenceType t(全部聲明)。

如果我沒有記錯的話,在.NET 2.0上運行的統一函數和協變性和反變量(允許像public delegate void MyDelegate(<T> obj);之類的功能)不會被添加到.NET框架中。可能3.5

Unity 2017更新爲運行在.NET 3.5(使用.NET 4。6個實驗可用),並且應該能夠在通用定義中協變和相互矛盾,儘管我自己還沒有探究過它。