我有以下课程:
public abstract class Gear<T> : ScriptableObject, IGear { ... }
public class Armor : Gear<ArmorStatsLevel> { ... }
public class Weapon : Gear<WeaponStatsLevel> { ... }
现在我有以下方法列出我的实例:
public abstract class WidgetListArmor {
public void ActionSelected(Armor gear) {
if (...) GameSession.Equip(gear);
}
}
public abstract class WidgetListWeapon {
public void ActionSelected(Weapon gear) {
if (...) GameSession.Equip(gear);
}
}
因为这有点多余,我想把它全部移到一个基地:
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> { ... }
虽然这看起来更干净,但我现在遇到了一个新问题。由于T是通用的,GameSession.Equip
无法重载gear
。
我选择了一个糟糕的模式来组织我的代码吗?我是否遗漏了Generics允许我进行此操作的内容?
更新
以下是GameSession签名:
public class GameSession {
public static bool Equip(Armor armor);
public static bool Equip(Weapon weapon);
}
答案 0 :(得分:3)
让Weapon
和Armor
实现名为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);
}
}
并GameSession.Equip
将IGear
作为参数类型。
答案 1 :(得分:1)