【发布时间】:2020-12-17 04:23:34
【问题描述】:
说明
我正在尝试为我的游戏编写效果(à la buffs/debuffs)。这是我想要构建的:
EffectsManager 类包含所有主动效果。像 HealthController 这样的类会查询它以获取与健康相关的效果,即实现 IHealthEffect 接口的效果,并返回一个仅包含此类效果的 List。
尝试的解决方案
内部EffectsManager:
public List<T> GetEffects<T>() {
List<T> effects = new List<T>();
foreach (ActiveEffect activeEffect in activeEffects) {
// ActiveEffect is just a wrapper for Effect that houses duration, time elapsed, etc.
// I only need to return the Effect itself, which houses the logic.
Effect effect = activeEffect.GetEffect();
if (effect is T) {
effects.Add((T)effect);
}
}
return effects;
}
然后,调用者脚本会写:
List<IHealthEffect> healthEffects = effectsManager.GetEffects<IHealthEffect>();
问题
无法将类型“Effect”转换为“T”
开启effects.Add((T)effect);。
类似问题
Cannot implicitly convert type 'Int' to 'T'
但就我而言,我不是隐式而是显式地转换。为什么编译器不让我继续,我应该使用Convert.ChangeType()——正如那里所建议的那样——无论如何?
更多信息
Effect 只是一个只有 1 个成员的抽象类:public int priority;。
由于效果可能会影响多个属性,例如健康和法力,我决定使用要求实现者编写特定方法的接口,例如:void Execute(HealthController healthController);。
【问题讨论】: