脑筋急转弯:用C#类定制逻辑字符串

时间:2013-02-26 03:09:33

标签: c# inheritance logic

所以,我的基本设置是这样的:我有项目,仅限于不同的课程。这些项目具有效果,也限于不同的类别。例如,我可能有一个只能由精灵操纵的物品,而另一个物品可能会被所有人操纵,但会为精灵提供特定的奖励/效果。

这是一个限制类:

public class Restriction {
    private int _base_id = 0;
    private bool _qualify = true;
    public Restriction() { }
    // ... Base_ID and Qualify getters and setters here
    public virtual bool Check(int c) {
        if(_qualify) { return c == _base_id; }
        else { return c != _base_id; }
}

Restriction类的子级可能是RaceRestriction,它只会覆盖构造函数:

public RaceRestriction(reference.races r, bool qual) {
    Base_ID = (int)r; Qualify = qual;
}

reference.races r是参考文件中的枚举。这里的想法是我可以将这个“限制”语法扩展到我在参考文件中定义的任何类 - 所以我可以对种族,类,统计数据进行限制,无论我需要什么。

所以,当我定义(例如)一个项目时,所有这些都会达到高潮,这个项目对谁可以装备它有限制。

下面是来自Equipment类的片段,我在其中定义了一个设备供以后使用(希望它的可读性):

public Equipment() { 
    ...
    _master_equipment_list[1] = new Equipment {
        Name = "Sword",
        Description = "It's just a sword for demonstration",
        Stats = {
            new Attribute {
                Stat_Modifier = new KeyValuePair<reference.stats, int>(reference.stats.ATTACK, 5),
                Restrictions = {
                    new RaceRestriction(reference.races.TROLL, false)
                }
            }
        },
        Restrictions = {
            new ClassRestriction(reference.class.WARRIOR, true)
        }
    }

所以这背后的想法就是使用这个系统,我已经定义了一把只能被战士使用的剑(基础战士对物品的真正限制),它对任何挥舞它的巨魔都会造成5次攻击。

我自己陷入困境的是,这只适用于逻辑AND或逻辑OR思路。说我的项目说“战士可以使用它”,它说“精灵可以使用它”。我真的是指“战士或精灵”,还是“战士精灵”?

我认为这种区别是必要的 - 所以我需要为每个限制附加一些逻辑,并且基本上我认为,这些限制彼此相关,该字符串与其他集合相关联限制等等,但我觉得这样会很快失控。

我有更好的方法吗?

1 个答案:

答案 0 :(得分:6)

我不是定义特定的限制类,而是通过定义一个由IRestrictable类实现的名为Equipment的接口来设计。此接口将包含至少一个名为CheckEligibility(或类似)的方法,它将返回一个bool。然后,您的设备类可以根据您想要的任何输入以及该类当时可用的任何信息,自由地使用它喜欢的任何逻辑表达式来提出答案。如果需要在不同情况下检查限制,可以在接口上使用多种方法。对于具有复杂规则的特定类型的设备,您可以自由地实现从Equipment派生的特定类。