c# 重载方法的泛型函数

标签 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));}
    }

我尝试了以下方法,但得到了无法将“T”表达式转换为类型“NavObject”:

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

最佳答案

可能,您甚至不需要为此使用泛型。您还可以为您的 NavObjectGameObject 创建一个接口(interface)来实现,其中包含您的 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

关于c# 重载方法的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45599034/

相关文章:

c# - Asp.net 标识 : change user role while logged in

c# - MVC Controller 将整个模型发布到远程 api 操作

c# - 如何从 SqlDataReader.Read() 期间的死锁异常中恢复

c# - 动态创建的游戏对象与数据(作为类实例)之间的关系

unity3d - 多声道音频输入统一

ios - 如何在 2019 年使用正确的配置文件通过命令行构建 Xcode 项目?

c# - ILOnly = 0 是否表示 C++/CLI?

c# - 为什么我的泛型约束仍然需要转换?

java - 静态类/接口(interface)的 Guice 泛型配置错误

java - 可以接受任何数字或任何其他可以添加的内容的通用类