如何解决如何实现基于其他选定选项限制选项的列表功能?
这是我面临的问题的一般设计问题。
我正在实现一个项目的UI列表,用户可以在其中一次选择多个项目。但是,某些选项在某种意义上进行了分组,原因是由于业务逻辑,一次只能选择其中一项。例如。如果列表包含项A,B,C,则需要一种方法来指定可以一次选择A,B或C的逻辑。
我考虑过在类设计中实现一个变量,该变量包含已分组的其他项的列表,因此,如果该列表中的任何项已被选择,则无法选择。但是,这似乎很难维护,因为如果一个组中有3个项目,那么如果向该组中添加了其他项目,则必须更新所有3个项目。
什么是解决此问题的更好的设计方案?
解决方法
一个选择是将std::shared_ptr<unsigned> group_selection
作为每个可选对象的成员。然后,如果两个对象(例如a
和c
不能同时选择,则共享指针必须指向同一对象。这样,选择a
并更新++*a.group_selection
将使您能够在选择*c.group_selection
之前检查c
是否为零。
示例:
#include <memory>
class Selectable {
private:
bool selected = false;
std::shared_ptr<unsigned> group_selection;
public:
Selectable() : group_selection(std::make_shared<unsigned>(0)) {}
~Selectable() {
unselect();
}
void add_to_group(Selectable const& of) {
group_selection = of.group_selection;
}
bool can_select() const {
return *group_selection == 0;
}
void select() {
if (!selected)
++*group_selection;
selected = true;
}
void unselect() {
if (selected)
--*group_selection;
selected = false;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。