c#重载方法的泛型函数

时间:2017-08-09 19:22:12

标签: c# generics unity3d overloading

我有两个方法,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));}
    }

3 个答案:

答案 0 :(得分: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...
}

您需要使用泛型的唯一原因是,如果您想在整个过程中强制执行相同的类型。在您提供的最小场景中,似乎并不是您需要的。如果你想使用Generics,你也可以使用Generic类型实现IHaveForce

答案 1 :(得分:1)

您接受FollowForce作为参数的AvoidForcetarget个函数也必须接受“T”类型

答案 2 :(得分:0)

如果您的对象共享功能,您应该引入一个抽象基类或接口TrackedObject,并在NavObjectGameObject中扩展它们。 然后,您可以编写以下内容

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

FollowForceAvoidForce的静态函数参数也必须是TrackedObject

类型