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

C# 如果父类是继承的类,如何获取父类?,c#,.net,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 v

让我们假设我有这个:

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?

    }
}
公共类项目
{
公共int ItemID;
公共列表附魔;//附魔是一个类
}
公共类:物品
{
公共int损害=18;
公共棍棒
{
ItemID=4;
}
公共无效更新()
{
foreach(附魔物品附魔中的附魔)
{
enchanment.Update();
}
}
}
公共级魔法
{
公共int-enchanmentid;
公共无效更新()
{
//这里需要帮助吗
Parent.Damage+=2;//我怎么知道我的父母是(棍子)?
//我想给每个物品一个唯一的id,两个物品不能有相同的id,所以附魔会检查物品列表中的特定id,然后将其用作父类。
//但是有没有更有效的方法呢?
}
}
我怎么知道我的父母是一个(棍子)? 我想给每个物品一个唯一的id,两个物品不能有相同的id,所以附魔会检查物品列表中的特定id,然后将其用作父类。 但是还有更有效的方法吗?


^考虑过展示自己的努力吗?我只是需要一种更有效的方法来实现这一点。

这不是父类。你的
棍子
魔法组成

简易路线:将
与以下方法一起传递:

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

// in Enchantment..
public void Update(Stick stick) {
    stick.Damage += 2;
}
<>为了使其更通用,考虑另一类实现<代码>损坏< /代码>修饰符:

public class ItemWithDamageModifier : Item {
    public int Damage { get; set; }
}
然后从中继承:

public class Stick: ItemWithDamageModifier {
然后您可以使用我的上述方法,如下所示:

public void Update(ItemWithDamageModifier damageItem) {
    damageItem.Damage += 2;
}
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; }
}

然后,您可以使用DamageModifier
传入任何继承的
项,例如
棍子
,或
员工
,或
,等等。

这不是父类。你的
棍子
魔法组成

简易路线:将
与以下方法一起传递:

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

// in Enchantment..
public void Update(Stick stick) {
    stick.Damage += 2;
}
<>为了使其更通用,考虑另一类实现<代码>损坏< /代码>修饰符:

public class ItemWithDamageModifier : Item {
    public int Damage { get; set; }
}
然后从中继承:

public class Stick: ItemWithDamageModifier {
然后您可以使用我的上述方法,如下所示:

public void Update(ItemWithDamageModifier damageItem) {
    damageItem.Damage += 2;
}
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; }
}

然后,您可以通过DamageModifier传入继承
物品的任何东西,例如
棍子
,或
棍子
,或
,等等。

附魔
不应该知道
物品
类的任何信息,否则它闻起来像是一个非常糟糕的设计。你最好有这样的smth:

public void Update(ItemWithDamageModifier damageItem) {
    damageItem.Damage += 2;
}
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;
        }
    }

enchanment
不应该知道
物品
类的任何信息,否则它闻起来像是一个非常糟糕的设计。你最好有这样的smth:

public void Update(ItemWithDamageModifier damageItem) {
    damageItem.Damage += 2;
}
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;
        }
    }

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

你要走的路是把游戏规则放到每个物体上;对象计算其自身的损坏。但是现在一些其他的代码将不得不考虑如果怪物抵抗附魔,或者是装甲,或者其他任何东西会发生什么


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

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

你要走的路是把游戏规则放到每个物体上;对象计算其自身的损坏。但是现在一些其他的代码将不得不考虑如果怪物抵抗附魔,或者是装甲,或者其他任何东西会发生什么


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

你说的“父母”是什么意思?我在你的代码中没有看到“家长”。@John哦,谢谢你。父项是棍子(列表中附魔的父项),但我想得到拥有该附魔的物品ENCHANTMENT@COLD父项是一根棍子,但它也是一个项目。请确保您的实现正确处理用户同时拥有+2和×2附魔的情况。具体来说,附魔顺序不影响附魔效果。我见过的一个解决方案是有一个
BaseDamage
成员。你说的“家长”是什么意思?我在你的代码中没有看到“家长”。@John哦,谢谢你。父项是棍子(列表中附魔的父项),但我想得到拥有该附魔的物品ENCHANTMENT@COLD父项是一根棍子,但它也是一个项目。请确保您的实现正确处理用户同时拥有+2和×2附魔的情况。具体来说,附魔顺序不影响附魔效果。我见过的一个解决方案是拥有一个
基本伤害
成员。这看起来很聪明,但是对于附魔,我不知道该物品是否是一根棍子。我怎么知道?也许我可以给每根棍子分配一个id,然后将该id转换为一个项目?例如:棍子是1,剑是2,盾是3。。。然后我就