在这种情况下是否可以避免投射?

时间:2020-02-23 18:36:10

标签: c# oop inheritance design-patterns

我正在尝试在我的游戏中实施状态效果系统。我会打电话给Status Effect S.E保持简短。

游戏的主要重点是魔术系统,当然应该将S.E应用于使用某些咒语击中的敌人。存在诸如Slow,Stun,Snare等常见事物,但应具有特殊的SE,具有独特的交互作用(例如,当敌人减速至最低阈值百分比时冻结敌人,当您使用火法术和其他命中敌人时触发爆炸你可以想象的疯狂的事情。

由于某些S.E的类型(如慢速)需要知道该类型的所有其他S.E,才能正确应用对Actor运动的影响,因此将S.E应用于IManager。有关使用IManager的具体示例:S.E将Decorators应用于某个actor组件,并且当一个效果结束时,需要恢复并重新应用以避免漏洞。移动速度的增加和减少的方法是这样的:首先是固定变化,最后是百分比,然后是百分比累积(如果同时激活两个S.E,则现在降低10%,之后降低10%,则总共降低20%)

在代码中,接口如下所示:

class Foo extends Derived
Foo extends Derived
public interface IReceiveStatusEffect
{
    Dictionary<string, IStatusManager> StatusManagers { get; set; } //ID of the effect and the Manager for that Effect
    void ReceiveEffect(IStatusEffect effect);
}

可以接收S.E的Actor需要具有IReceiveStatusEffect,因此流程如下:

public interface IStatusEffect
{
    IStatusManager Manager { get; set; }
    GameObject Target { get; set; }
    float Duration { get; set; }
    string ID { get; } //The ID is Used on concrete implementations to get the SpellManager from IReceiveStatusEffect
    void ApplyEffect();
    void RemoveEffect();
}

解释了一切之后,这就是我面临的问题: 由于SE的种类繁多,因此有些人需要了解某些东西的具体实现(例如IStatusManager的具体实现),例如我之前给出的S.Elow示例。我尝试了简单的铸造,但是它确实起作用了,但是在几乎所有到我看来的地方,每个人都说应该不惜一切代价避免铸造。如果您需要投射,那可能是一个不好的设计。那个转换是反模式,等等

但是我不知道如何立即获得我需要的信息而无需转换。我曾想过,但对于我当前所需的流程,这似乎是最好的(如果不是用于转换的话),并且无法考虑该问题的另一种设计模式,因此,我正在尝试寻找一种解决方案不要使用铸件,因为它似乎已经皱了起来。

0 个答案:

没有答案