2017-08-09 54 views
1

我有兩種方法,FollowForce()和AvoidForce(),它們被重載以接受NavObject或GameObject。有沒有簡化Follow()函數來接受這兩種類型的方法?c#重載方法的通用函數

public void Follow(NavObject target){ 
     if(isFollowing){Body.AddForce(FollowForce(target));} 
     if(isAvoiding){Body.AddForce(AvoidForce(target));} 
    } 

public void Follow(GameObject target){ 
     if(isFollowing){Body.AddForce(FollowForce(target));} 
     if(isAvoiding){Body.AddForce(AvoidForce(target));} 
    } 

我嘗試以下,但得到cannot convert 'T' expression to type 'NavObject'

public void Follow <T>(T target){ 
     if(isFollowing){Body.AddForce(FollowForce(target));} 
     if(isAvoiding){Body.AddForce(AvoidForce(target));} 
    } 
+1

最有可能,但我們需要看看'NavObject'和'GameObject'對象,以及'FollowForce'和'AvoidForce'方法。 – krillgar

+1

您需要'NavObject'和'GameObject'繼承相同的基類(然後'FollowForce()'和'AvoidForce()'應該接受基類類型的參數)。或者你需要'NavObject'和'GameObject'來實現相同的接口(然後'FollowForce()'和'AvoidForce()'應該接受接口類型的參數)。 – user1304444

+0

您需要在您的問題中顯示FollowForce和AvoidForce作爲編輯。你想要的可能是可能的,但這取決於這些方法的作用。這就是說,我只是堅持重載版本。 –

回答

1

FollowForceAvoidForce函數,它們接受target作爲參數,還必須接受 「T」 型

0

如果你的對象共享功能,您應該引入抽象基類或接口TrackedObject並將它們擴展到NavObjectGameObject。 然後,您可以編寫以下

public void Follow(TrackedObject target){ 
    if(isFollowing){Body.AddForce(FollowForce(target));} 
    if(isAvoiding){Body.AddForce(AvoidForce(target));} 
} 

你的靜態功能FollowForceAvoidForce參數然後還必須類型TrackedObject

2

潛在的,你甚至不需要使用泛型與此有關。您還可以爲您的NavObjectGameObject創建一個界面,以實現包含您的FollowForceAddForce方法中所需的所有屬性/方法。

public void Follow(IHaveForce target) 
{ 
    if (isFollowing) 
    { 
     Body.AddForce(FollowForce(target)); 
    } 
    if (isAvoiding) 
    { 
     Body.AddForce(AvoidForce(target)); 
    } 
} 

那麼你的其他方法將需要設立這樣的:

public Force FollowForce(IHaveForce target) 
{ 
    // Do your work... 
} 

public Force AvoidForce(IHaveForce target) 
{ 
    // Do your work... 
} 

你需要使用,如果你想在整個執行同一類型的泛型是唯一的原因。在你提供的最小場景中,似乎並不像你需要的那樣。如果您想要使用泛型,您也可以使用泛型類型IHaveForce

+0

完整免責聲明:我是泛型的**支持者,但是這是一種不必要的情況。 – krillgar