Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么样的接口类型适合于实现具有不同签名的策略?_C#_Unity3d_Events_Interface - Fatal编程技术网

C# 什么样的接口类型适合于实现具有不同签名的策略?

C# 什么样的接口类型适合于实现具有不同签名的策略?,c#,unity3d,events,interface,C#,Unity3d,Events,Interface,考虑以下游戏代码: 公共类玩家:单行为{ 公共无效使用项(项){ 项目.使用(本); } public void getdunk(){} } 公共类项目{ 公共WhatInterface[]项目用途; 公共无效使用(玩家){ foreach(itemUsages中的var用法){ Execute(新的ItemUsageArgs{itemUser=player,itemUsed=this}) } } } 公共类GameManager:MonoBehavior{ 公众人物; 公共项目啤酒=新项目{i

考虑以下游戏代码:

公共类玩家:单行为{
公共无效使用项(项){
项目.使用(本);
}
public void getdunk(){}
}
公共类项目{
公共WhatInterface[]项目用途;
公共无效使用(玩家){
foreach(itemUsages中的var用法){
Execute(新的ItemUsageArgs{itemUser=player,itemUsed=this})
}
}
}
公共类GameManager:MonoBehavior{
公众人物;
公共项目啤酒=新项目{itemUsages=new[]{
新建TestConsole(),
新损坏来自项(),
新项目()
}}
私有void Start(){
主要特征。用途(啤酒);
}
}
公共类测试控制台:WhatInterface{
public void Execute(BaseArgs args){
Log(“已执行函数调用”);
}
}
来自项目的公共类损坏:WhatInterface{
公共作废执行(ItemUsageArgs){
Debug.Log(args.itemUser+“从”+args.itemUsed中受到伤害”);
}
}
公共类项目:WhatInterface{
公共作废执行(ItemUsageArgs){
args.itemUser.getDunk();
}
}
公共类BaseArgs{}
公共类ItemUsageArgs:BaseArgs{
公共播放器项目用户;
使用的公共物品;
}
那么,如何创建适合ItemUsage的接口类型代码呢

还是我错误地为这种环境创建了设计

基本上,我在尝试策略模式,这样每种商品的使用都会有所不同

我尝试过的事情,创建IItemUsage接口:

public interface IItemUsage {
    void Execute(ItemUsageArgs args);
    // but then anything that needs to implement this interface must use this method, even though it only needs BaseArgs.
    // TestConsole class must conform to Execute(ItemUsageArgs) signature..
}

public class TestConsole : IItemUsage {
    public void Execute(BaseArgs args) {
        Debug.Log("function call executed");
    }
    // this won't compile
}

若您想使用具有不同类型的输入参数的方法实现接口,则必须定义基参数类或使用接口参数

例如:

public interface IItemUsage
{
    void Execute(IItemUsageArgs args);
}
public interface IItemUsageArgs
{
    //place public part of all ItemUsageArgs
}

public class ItemUsageArgs1 : IItemUsageArgs
{

}

public class ItemUsageArgs2 : IItemUsageArgs
{

}
public class ItemUsage1 :IItemUsage
{
    public void Execute(ItemUsageArgs1 args)
    {
        //do you need
    }
    void IItemUsage.Execute(IItemUsageArgs args)
    {
        Execute(args as ItemUsageArgs1);
    }
}

public class ItemUsage2 : IItemUsage
{
    public void Execute(ItemUsageArgs2 args)
    {
        //do you need
    }
    void IItemUsage.Execute(IItemUsageArgs args)
    {
        Execute(args as ItemUsageArgs2);
    }
}

假设这是您的所有代码,您可以使
IItemUsage
generic,并使用generic参数

public interface IItemUsage<in T> where T: BaseArgs {
    void Execute(T args);
}

您是否要求提供合适的接口名称?我要求接口类型包含您可以使用Execute方法在接口上创建的所有不同用法。在TestConsole中实现该接口,DamageFromItem和DuckFromItem类。TestConsole和其他FromItem类具有不同的签名,先生,您能提供示例代码吗?我不太确定解决方案,但至少,我认为您的关系播放器/项目是两种方式,我会避免这种情况。很可能物品没有理由知道消费者(玩家),物品提供数据,玩家将使用这些数据。你会认为伏特加不需要知道是人喝还是狗喝?这里也一样。可能是有用的链接:,这一个是正确的,尽管我不知道为什么仍然要删除代码中的where tworks@KevinTanudjaja这是意料之中的。更多信息,请阅读derHugo发布的第二个链接。
where
子句用于防止意外地将一个不是
BaseArgs
子类的类放入
中。
IItemUsage<ItemUsageArgs>[] arr = new IItemUsage<ItemUsageArgs>[] { 
    new TestConsole(), new DamageFromItem(), new DrunkFromITem()
};