vendredi 2 juin 2017

How to refer to instances of a class universally without type codes?

I was making a text based RPG in which I have an abstract Item class. From this Item class, I have the classes Weapon, Potion, Key, and Armor. The main character class, Protagonist uses these items and has a function doItemEffect(Item*). How do I implement doItemEffect(Item*) in a way that I refer to all items in universally? To better phrase my problem, if I wasn't clear, here is an example that uses a quite ugly solution.

class Protagonist
{
public:
    void doItemEffect(Item* it)
    {
        switch(it.getType()) //<-- The type is an enum class
        {
        case ItemType::WEAPON:
            attackOpponent(it.getAttackPower()); //If it is a weapon it would have this function
            break;
        case ItemType::POTION:
            heal(it.getHealPower()); //If it is a weapon it would have this function
            break;
        case ItemType::KEY:
            //..Code..
            break;
        case ItemType::ARMOR:
            //More Code...
            break;
     }
};

And an example of two of the classes Potion and Weapon (The type of the class is a private variable stored in Item with a mutator method setType()):

class Potion : public Item
{
    int healPower;
public:
    Potion(std::string name, std::string description) : Item(name, description)
    {
        setType(ItemType::POTION);
    }
    //Code
};

Weapon:

class Potion : public Item
{
    int attackPower;
public:
    Potion(std::string name, std::string description) : Item(name, description)
    {
        setType(ItemType::WEAPON);
    }
    //Code
};

As you can see, this code relies on an class code and a switch in the Protagonist class. Because of this, this doesn't seem very object oriented or polymorphic. Thus, is there a way I could get what subclass a type of Item is, without having to use class codes? Or is there any other solution? The other problem with this snippet above is also that whenever I refer to an item outside of its class, I have to use the same switch statement for each type of item.

Aucun commentaire:

Enregistrer un commentaire