我有一组相关的课程,称之为
class Manager {
private:
std::vector<Setting> m_settings;
}
class Setting {
private:
std::vector<Action> m_actions;
}
class Action {
private:
Keybind m_keybind;
}
class Keybind {
public:
UpdateKeybind;
private:
TYPE keybind;
}
从伪C ++代码中可以看出,“设置”具有操作,而操作只有一个键绑定。现在,作为我的应用程序的用户,您想要更新Keybind,是吗?
我目前在与每个操作相关联的键绑定类型对话框中都有按钮,因此操作可以处理更新它自己的键绑定。
我的问题:
如何确保Keybinding不与另一个对象绑定?
可能的解决方案:
我需要你:
在可维护性,速度,易于理解和OOP适用性方面,最严格的方法是什么,实现检查是否已找到Keybind,是否出自我建议的解决方案或其他完全不同的方法。我已经尝试过1号 - 它有效,但我觉得它可能更好,你在挖? 我无法在StackOverflow上找到类似的问题,但如果你这样做我很乐意看到它们!
任何其他专业提示,需要改进的地方都很有帮助。
答案 0 :(得分:1)
由于键绑定和操作之间只有1:1的关系,因此您可以从一个键绑定对象池开始,并在配置操作时从池中向下绘制。因此,在提供可用的配置密钥时,任何已绑定的密钥都不在可用池中。
答案 1 :(得分:1)
就像@Amardeep所说,你可以尝试创建一个管理动作和键绑定之间映射的类。以下是一个例子。如果存在与该键绑定的新绑定,它将自动删除操作的键绑定。
class Manager {
private:
std::vector<Setting*> m_settings;
KeybindPool *m_keybindPool;
};
class Setting {
private:
std::vector<Action*> m_actions;
};
class Action {
public:
void Bind(Keybind* keybind) {
m_manager->m_keybindPool->Update(this, keybind)
}
Keybind* getKeybind() const {
return m_manager->m_keybindPool->getKeybind(this);
}
private:
Manager *m_manager;
};
class KeybindPool {
public:
void Update(Action* action, Keybind* keybind) {
if (m_keybindActionMap.find(keybind) != m_keybindActionMap.end()) {
m_actionKeybindMap.erase(action);
}
m_keybindActionMap[keybind] = action;
m_actionKeybindMap[action] = keybind;
}
Keybind* getKeybind(Action* action) {
return m_actionKeybindMap[action];
}
private:
map<Keybind*, Action*> m_keybindActionMap;
map<Action*, Keybind*> m_actionKeybindMap;
};
class Keybind {
private:
TYPE keybind;
}