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 を与えることを考えました。2 つのアイテムが同じ ID を持つことはできないため、エンチャントはアイテム リストで特定の ID をチェックし、それを親クラスとして使用します。しかし、より効率的な方法はありますか?

^ 努力を示していると思われるおお?これを達成するためのより効率的な方法が必要です..

4

3 に答える 3

6

私は提案された2つの答えのどちらよりも根本的な提案をします(どちらも合理的です)。私は一歩下がって、「ここで誰が担当しているのか」という質問をします。つまり、実際にゲームのルールを表すコードはどれですか?

ここで進む道は、ゲームのルールを各オブジェクトに入れることです。オブジェクトはそれ自身のダメージを計算します。しかし、今度は、モンスターがエンチャントに抵抗したり、鎧を着たりした場合に何が起こるかを考慮に入れる必要があります。

このような状況で私が好むアプローチは、ゲームのルールを実際にエンコードする一連のRulesオブジェクトを作成することです。そうすれば、明確な責任があります。アイテムは、ルールエンジンにどのエンチャントを持っているかを伝える責任があり、ルールエンジンは何が起こるかを判断します。このアプローチを選択すると、多くの問題が解決することがわかると思います。

于 2013-02-13T02:04:11.210 に答える
5

これは親クラスではありません。Stickで構成されてい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

于 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 に答える