cod*_*der 4 c++ polymorphism switch-statement
我对我在帖子中读到的内容有些困惑:case-vs-if-else-if-which-is-more-efficient
多次建议使用多态来代替长的 case/if-else 语句。我想弄清楚这到底意味着什么。如何更换:
case TASK_A:
// do things for task A
break;
case TASK_B:
// do things for task B
break;
:
:
case TASK_J:
// do things for task J
break;
Run Code Online (Sandbox Code Playgroud)
与多态性?如果“do ...”部分基本上是相同的重复,我可以理解它,但是如果某些或所有“案例”之间存在显着差异,那么这仍然适用吗?
在您链接到的示例中,switchis 覆盖了对象的类型,建议使用多态性来消除检查类型的需要。也就是说,在基类中声明一个虚函数,为每个具体类覆盖它以做任何需要做的事情,并用switch对该函数的调用替换整个。
在您的情况下,您正在测试变量的值,而不是对象的类型。但是,如果需要,您可以将其转换为多态解决方案:
struct Task {virtual void do_things() = 0;};
struct TaskA : Task {virtual void do_things() {/*do things for task A*/}};
struct TaskB : Task {virtual void do_things() {/*do things for task B*/}};
//...
struct TaskJ : Task {virtual void do_things() {/*do things for task J*/}};
Run Code Online (Sandbox Code Playgroud)
然后你可以用一个(智能)指针替换你正在切换的变量Task;和开关task->do_things()。这是否比 a 更好switch是一个品味问题。