如果父类是继承类,如何获取父类?

时间:2013-02-13 01:17:12

标签: c# .net

让我说我有这个:

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,然后将其用作父类。 但是有更有效的方法吗?

^考虑显示努力O.o?我只需要一种更有效的方法来实现这个目标。

3 个答案:

答案 0 :(得分:6)

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

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

在这种情况下我更喜欢的方法是制作一堆规则对象实际编码游戏规则。这样就有明确的责任;项目负责告诉规则引擎他们拥有什么附魔,规则引擎可以解决发生的事情。我想如果你选择这种方法,你会发现很多问题都消失了。

答案 1 :(得分:5)

这不是父类。 Stick的{​​{1}} 撰写 Enchantments

轻松路线:将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的内容,例如StickStaffGun等。

答案 2 :(得分: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;
        }
    }