我有基類產品用來存儲一些數據,並通過存取授予其訪問權限,如:所有派生類通用接口
class Item{
(...)
public:
int get_value();
double get_weight();
ItemMaterial get_material();
(...)
}
那麼我就派生類,如武器,防具裏面加一些額外的數據:
class Weapon : public Item {
(...)
public:
int get_dmg();
(...)
}
我這些物品存放在一些容器:
std::vector<Item*> inventory;
這裏來的接口問題 - 如何訪問派生類數據?我想,並得到3種思路:
1.分離的接口
每個派生類增加它的數據,如在上面示出,然後用dynamic_cast的:
Item *item = new Weapon;
int dmg = dynamic_cast<Weapon*>(item)->get_dmg();
2 。通用接口類
與所有訪問器構成一個接口類:
ItemInterface{
public:
virtual int get_value() = 0; //Item interface
virtual double get_weight() = 0;
(..)
virtual int get_dmg() = 0; //Weapon interface
(...)
}
然後是這樣的:
Item : public ItemInterface{ (...) }
和
Weapon : public Item { (...) }
終於可以訪問數據:
Item *item = new Weapon;
int dmg = item->get_dmg();
3.組合使用模板和枚舉
這種想法也許有點不可思議,但:-):
實現與所有項目數據枚舉:
enum class ItemData{
Value,
Weight,
Material, //Item data
(...)
Damage, //Weapon data
(...)
Defense, //armor data etc.
(...)
Null
}
,並在基類中的一些模板函數是這樣的:
template<typename T>
T get_data(ItemData data){
switch(data){
case ItemData::Value: return _value; break;
case ItemData::Damage: return _dmg; break;
(...)
}
}
和訪問數據,如:
Item *item = new Weapon;
ind dmg = item->get_data<int>(ItemData::Damage);
===
您認爲應該怎麼做?我會感激任何意見!
問候。
如果需要訪問特定derived-類的東西,你爲什麼使用指針到基地?換句話說,給定一個任意的Item *',你怎麼知道它適合轉換爲'武器*'來得到武器特定的東西? –
沒有好 - 如果您無法爲數據建模,請使用dynamic_cast –
因爲,例如,對象Creature包含庫存(如示例中所示),並且我想將所有基於項目的類保存在此容器中。如果它合適? dynamic_cast給我這個信息。在其他情況下,我想我應該,例如,在基礎類中添加一些數據字段,以提供此信息。 –