1

所以可以说我有这个:

public class Item
{
    public int ItemID;
    public List<Enchantment> Enchantments; //Enchantment is a class
}

public class Stick: Item
{
    public int Damage = 18;
    public Stick()
    {
        ItemID = 4;
    }

    public void Update()
    {
        foreach (Enchantment ItemEnchantment in Enchantments)
        {
            Enchantment.Update();
        }
    }
}

public class Enchantment
{
    public int EnchantmentID;

    public void Update()
    {
        //NEED HELP HERE

        Parent.Damage += 2; //How do I know my parent is a (Stick)?
                        //I thought of giving each item a uniqueID, and two items cannot have the same id, so the enchantment checks the items list for a specific id, and then uses that as the parent class.
                        //But is there a more efficient way?

    }
}

我怎么知道我的父母是(棒)?我想给每个项目一个唯一的ID,两个项目不能有相同的ID,所以结界检查项目列表中的特定ID,然后将其用作父类。但是有没有更有效的方法?

^ 考虑显示努力 Oo ? 我只需要一种更有效的方法来完成这个..

4

3 回答 3

6

我会提出一个比两个提议的答案中的任何一个都更激进的建议(这两个答案都是合理的)。我会退后一步,问“谁在这里负责?”这个问题。也就是说,哪一段代码实际上代表了游戏规则?

你在这里要走的路是将游戏规则放入每个对象中;物体计算自己的伤害。但是现在其他一些代码将不得不考虑如果怪物抵抗结界,或者是装甲,或者其他什么会发生什么。

在这些情况下,我更喜欢的方法是制作一堆实际编码游戏规则的Rules 对象。这样就有了明确的责任;物品负责告诉规则引擎他们有什么附魔,规则引擎会计算出会发生什么。我认为,如果您选择这种方法,您会发现很多问题都消失了。

于 2013-02-13T02:04:11.210 回答
5

这不是父类。你StickEnchantments. _

简单的路线:通过Stick方法:

// in Stick
foreach (Enchantment ItemEnchantment in Enchantments) {
    ItemEnchantment.Update(this);
}

// in Enchantment..
public void Update(Stick stick) {
    stick.Damage += 2;
}

为了使其更通用,请考虑使用另一个实现Damage修饰符的类:

public class ItemWithDamageModifier : Item {
    public int Damage { get; set; }
}

然后从这里继承:

public class Stick: ItemWithDamageModifier {

然后你可以改用我上面的方法,像这样:

public void Update(ItemWithDamageModifier damageItem) {
    damageItem.Damage += 2;
}

然后你可以传入任何继承的东西ItemWithDamageModifier,例如 a Stick、 or Staff、 orGun等​​。

于 2013-02-13T01:22:27.983 回答
0

Enchantment不应该对这个类一无所知,Item否则它闻起来就像一个非常糟糕的设计。你最好有这样的东西:

public class Enchantment
{
    public int EnchantmentID;
    //a property, that contains the damage given by the Enchantment
    //so, when constructing an Enchantment 
    //you should set it to some certain value
    public int Damage { get; set; }
}

根本不需要Update任何类中的方法,而是:

    int BaseDamage = 18; //a base damage of the item
    //the fact damage, i.e. sum of the base one and all the enchantments
    public int Damage    
    {
        get
        {
            int encDamage = 0;
            if (Enchantments.Any())
                encDamage += Enchantments.Sum(e => e.Damage);
            return BaseDamage + encDamage;
        }
    }
于 2013-02-13T01:27:47.283 回答