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

use*_*879 3 c# logic inheritance

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

这是一个限制类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

public RaceRestriction(reference.races r, bool qual) {
    Base_ID = (int)r; Qualify = qual;
}
Run Code Online (Sandbox Code Playgroud)

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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我自己走投无路的是,这只适用于逻辑AND或逻辑OR思路.说我的项目说"战士可以使用它",它说"精灵可以使用它".我真的是指"勇士或精灵",还是指"战士精灵"?

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

有没有更好的方法可以做到这一点?

Ste*_*ett 6

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