我有两个方法,FollowForce()和AvoidForce(),它们被重载以接受NavObject或GameObject。有没有办法简化Follow()函数以接受这两种类型?
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));}
}
答案 0 :(得分:2)
您可能甚至不需要使用泛型。您还可以为NavObject
和GameObject
创建一个界面,以实现包含FollowForce
和AddForce
方法中所需的所有属性/方法。
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...
}
您需要使用泛型的唯一原因是,如果您想在整个过程中强制执行相同的类型。在您提供的最小场景中,似乎并不是您需要的。如果你想使用Generics,你也可以使用Generic类型实现IHaveForce
。
答案 1 :(得分:1)
您接受FollowForce
作为参数的AvoidForce
和target
个函数也必须接受“T”类型
答案 2 :(得分:0)
如果您的对象共享功能,您应该引入一个抽象基类或接口TrackedObject
,并在NavObject
和GameObject
中扩展它们。
然后,您可以编写以下内容
public void Follow(TrackedObject target){
if(isFollowing){Body.AddForce(FollowForce(target));}
if(isAvoiding){Body.AddForce(AvoidForce(target));}
}
FollowForce
和AvoidForce
的静态函数参数也必须是TrackedObject