作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对帖子中的内容感到有些困惑: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;
多态性?如果“做......”部分基本上是相同的重复,我可以理解它,但如果部分或所有“案例”之间存在显着差异,那么这是否仍然适用?
最佳答案
在您链接到的示例中,开关
覆盖对象的类型,建议使用多态性来消除检查类型的需要。也就是说,在基类中声明一个虚函数,为每个具体类覆盖它以执行任何需要做的事情,并用对该函数的调用替换整个 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*/}};
然后您可以用指向Task
的(智能)指针替换您正在切换的变量;并使用 task->do_things()
进行切换。这是否比 switch
好是个人喜好问题。
关于c++ - 为什么可以用多态来代替switch或else-if语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19158240/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!