Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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#_Generics - Fatal编程技术网

C# 对基类使用泛型时重载方法

C# 对基类使用泛型时重载方法,c#,generics,C#,Generics,我有以下课程: public abstract class Gear<T> : ScriptableObject, IGear { ... } public class Armor : Gear<ArmorStatsLevel> { ... } public class Weapon : Gear<WeaponStatsLevel> { ... } 因为这有点多余,我想把它全部移到一个基本类: public abstract class WidgetLi

我有以下课程:

public abstract class Gear<T> : ScriptableObject, IGear { ... }

public class Armor : Gear<ArmorStatsLevel> { ... }

public class Weapon : Gear<WeaponStatsLevel> { ... }
因为这有点多余,我想把它全部移到一个基本类:

public abstract class WidgetListGear<T> : MonoBehaviour {

    public void ActionSelected(T gear) {
        if (...) GameSession.Equip(gear);
    }
}

public class WidgetListArmors  : WidgetListGear<Armor> { ... }

public class WidgetListWeapons : WidgetListGear<Weapon> { ... }

使
武器
装甲
实现名为
IGear
的接口,例如:

public interface IGear 
{ }

public class Weapon : IGear
{
    //snip
}

public class Armor : IGear
{
    //snip
}
将泛型类型约束为IGear:

public abstract class WidgetListGear<T> : MonoBehaviour
    where T : IGear
{

    public void ActionSelected(T gear) {
        if (...) GameSession.Equip(gear);
    }
}
公共抽象类WidgetListGear:MonoBehavior 其中T:IGear { 已选择公共齿轮(T档){ 如果(…)游戏会话。装备(装备); } }
并制作
GameSession。装备
IGear
作为参数类型。

制作
武器
盔甲
实现一个名为
IGear
的接口,例如:

public interface IGear 
{ }

public class Weapon : IGear
{
    //snip
}

public class Armor : IGear
{
    //snip
}
将泛型类型约束为IGear

public abstract class WidgetListGear<T> : MonoBehaviour
    where T : IGear
{

    public void ActionSelected(T gear) {
        if (...) GameSession.Equip(gear);
    }
}
公共抽象类WidgetListGear:MonoBehavior 其中T:IGear { 已选择公共齿轮(T档){ 如果(…)游戏会话。装备(装备); } }

并制作
GameSession.equipment
IGear
作为参数类型。

您需要的是动态调度。我建议您尝试以下方法:

GameSession.Equip((dynamic)gear);
然而,我认为这不是最好的主意,因为您已经尝试在类型系统中编码您的游戏规则,而现在您正在运行时启动一个迷你编译器来为您执行分派

我想让你看看埃里克·利珀特关于这个问题的文章。看起来你对他的描述也有类似的问题


描述了我提供的动态方法及其缺点。提供了一种完全不同的方法。总的来说,我强烈建议您阅读每一部分。

您需要的是动态调度。我建议您尝试以下方法:

GameSession.Equip((dynamic)gear);
然而,我认为这不是最好的主意,因为您已经尝试在类型系统中编码您的游戏规则,而现在您正在运行时启动一个迷你编译器来为您执行分派

我想让你看看埃里克·利珀特关于这个问题的文章。看起来你对他的描述也有类似的问题



描述了我提供的动态方法及其缺点。提供了一种完全不同的方法。总的来说,我强烈建议阅读每一部分。

武器和装甲已经有了IGear接口。你的意思是
GameSession.Equipment
的签名应该是
public static bool Equipment(IGear gear)?那么它怎么知道它收到的是盔甲还是武器呢?(因为当时采取的行动不同。)如果采取的行动不同,那么你应该有两个不同的方法,而不是让一个方法做两件不同的事情。我有两个不同的方法。我只想让它过载到正确的位置。你可以在
IGear
界面上有一个名为
equipment()
的方法,它将责任委托给所装备的物品。我完全同意DavidG的观点。。。物品应该最了解如何装备自己,除非是经过认证的时装设计师,否则不要让第三方处理装备:)武器和装甲已经有了IGear接口。你的意思是
GameSession.Equipment
的签名应该是
public static bool Equipment(IGear gear)?那么它怎么知道它收到的是盔甲还是武器呢?(因为当时采取的行动不同。)如果采取的行动不同,那么你应该有两个不同的方法,而不是让一个方法做两件不同的事情。我有两个不同的方法。我只想让它过载到正确的位置。你可以在
IGear
界面上有一个名为
equipment()
的方法,它将责任委托给所装备的物品。我完全同意DavidG的观点。。。物品应该最了解如何装备自己,除非是经过认证的时装设计师,否则不要让第三方来处理装备:)这取决于你是否可以将你的
equipment
方法重新写入一个方法。有许多模式可以帮助将项目特定代码的责任推到应用程序的其他部分。然而,如果你真的需要在这一点上加以区分,我唯一能想到的就是反射或访问者模式。这完全取决于你是否可以将你的
equipment
方法重新编写为一个方法。有许多模式可以帮助将项目特定代码的责任推到应用程序的其他部分。然而,如果你真的需要在这一点上加以区分,我唯一能想到的就是反射或访问者模式。。。然而,相关部分可能是第5部分,而不是链接的第4部分。我的推理基于第4部分描述动态方法的事实。我认为所有部分可能都与这个问题相关,并且在一般情况下都非常有用。基本上,在第4部分的末尾,他得出结论认为
dynamic
并不是一个好方法,并承诺会有更好的解决方案;)我重新制定了一点答案,希望现在我们都能接受。链接文章+1。。。然而,相关部分可能是第5部分,而不是链接的第4部分。我的推理基于第4部分描述动态方法的事实。我认为所有部分可能都与这个问题相关,并且在一般情况下都非常有用。基本上,在第4部分的末尾,他得出结论认为
dynamic
并不是一个好方法,并承诺会有更好的解决方案;)我重新制定了一点答案,希望现在我们都能接受。