【发布时间】:2016-12-06 19:35:10
【问题描述】:
我面临以下设计问题:
TL;TD 需要确定 Hero(class) 是否可以使用特定的对象,而有很多 hero 实现
我有 3 个英雄类的子类,每个子类都可以使用特定的物品。
对于 Weapons.hpp,我有剑、锤、弩、弓、魔杖、法杖。
战士可以使用剑或锤 弓箭手可以使用弩或弓 巫师可以使用法杖或魔杖
还有 Hero 基类:
class Hero: public Entity{
public:
Hero(std::string name, Gender gender, double damage, Point2d* location);
~Hero();
virtual void move(int x, int y);
virtual void damage(Entity* other); // Override
virtual bool use(Potion* _potion);
virtual bool use(Weapon* _weapon) = 0;
virtual bool use(ShieldArmor* _shieldArmor) = 0;
virtual bool use(BodyArmor* _bodyArmor) = 0;
private:
std::string name;
Gender gender;
Weapon* weapon;
ShieldArmor* shield_armor;
BodyArmor* body_armor;
};
这是武器:
class Weapon: public Item{
public:
Weapon(double damage, Point2d* location);
virtual ~Weapon();
virtual double getDamage() const;
virtual const Point2d* getLocation() const;
virtual const std::string toString() const;
private:
Point2d* location;
double damage;
};
在游戏主界面中,我需要确定 Hero *h 是否可以在不向下施放的情况下使用特定物品。
所以我可以像这样使用它:
Hero *h;
Weapon * i;
// do something assign values
h->use(i);
【问题讨论】:
-
有趣的事实:您不需要对所有事情都使用指针。如果您避免使用有利于静态分配、容器和引用的指针,通常会更好。
-
@user4581301 地图的输入是动态的。在从地图的输入中获取英雄类型后,我需要根据一些输入确定所有这些内容。
-
在不了解武器使用规则的情况下,很难说解决问题的最佳方法。以老式 D&D 为例,您可以让
class Class包含一个列出所有允许的武器类型的std::set<weapontype> allowedWeapons和一个bool canUse(Weapon *)方法,如果武器类型在set中,则返回 true。class Weapon需要一个weapontype getType()方法来支持这一点。所以class Cleric: public Class会在攻击前初始化allowedWeapons({OneHandBlunt, TwoHandBlunt, ...})而Hero会myclass->canUse(weapon)。
标签: c++ inheritance