我正在開發C++ roguelike RPG遊戲。現在我正在完成任務系統,這個想法是有抽象類Quest,每個新任務(例如「殺老鼠守衛」)都是新類,每個任務都包含我們需要做的抽象目標類的一些目標,一個一個。這工作正常。問題是目標彼此不同,例如實現多態的想法
class KillMonstersWhole : public Objective
{
vector<KillMonster> vector_of_monsters_to_kill;
public:
virtual void ShowObjectiveStatus();
virtual void CheckIfConditionsFilled();
virtual vector<KillMonster> GetMonstersToKill() { return vector_of_monsters_to_kill; }
virtual vector<KillMonster>::iterator GetBeginOfMonstersToKill() { return vector_of_monsters_to_kill.begin(); }
virtual vector<KillMonster>::iterator GetEndOfMonstersToKill() { return vector_of_monsters_to_kill.end(); }
KillMonstersWhole(int amount, KillMonster first, ...);
};
那類需要像GetMonsterToKill()等。(這是一個從抽象繼承目標)的一些特定功能,但如該
class ReachXY : public Objective
{
int x, y;
string status_text;
public:
virtual void ShowObjectiveStatus();
virtual void CheckIfConditionsFilled();
ReachXY(int x, int y, string status_text);
};
並不需要它,我不知道怎麼弄一種實現它的方式,不需要創建空白函數,這些函數不會做任何事情,並且會破壞我的代碼。我想繼續從一個抽象類繼承,因爲它的工作很好 - 在Quest類中,我只有一個Objective *對象的向量。我知道我可以在基礎Objective類中創建vector_of_monsters_to_kill,然後創建一個非純的虛函數,但ReachXY會帶上額外的,不可用的地方。當我使這個函數非虛擬化並將它們放在KillMonstersWhole類中時,我將失去通過多態指針來獲取它的能力Objective *。有什麼聰明的方法來做到這一點? Objective and Quest classes for everything clear:
class Objective
{
protected:
bool conditions_fullfilled;
OBJECTIVE_ID id;
public:
Objective() {}
bool GetConditionsState() { return conditions_fullfilled; }
virtual void ShowObjectiveStatus() = 0;
virtual void CheckIfConditionsFilled() = 0;
virtual vector<KillMonster> GetMonstersToKill() = 0;
virtual vector<KillMonster>::iterator GetBeginOfMonstersToKill() = 0;
virtual vector<KillMonster>::iterator GetEndOfMonstersToKill() = 0;
virtual OBJECTIVE_ID GetID() { return id; }
virtual ~Objective() {}
};
class Quest
{
protected:
string name;
vector<Objective*> objectives_list;
vector<Objective*>::iterator quest_state;
public:
Quest() {}
vector<Objective*>::iterator GetQuestState() { return quest_state; }
OBJECTIVE_ID GetQuestStateID();
vector<Objective*> GetObjectivesList() { return objectives_list; }
virtual void CheckRaiseQuestState();
virtual void ShowDescription() = 0;
virtual ~Quest() {}
};
多態性依賴於統一的_interface contracts_。 –