如何高效利用多态(polymorphism)替代大量switch-case与if-else?
替代Switch-Case的多态优化方案
你已经正确用虚函数处理了对象的输入输出逻辑,但创建对象的switch-case确实会在类数量增加时变得臃肿。可以用对象工厂映射表彻底消除这部分分支判断,具体实现如下:
1. 定义工厂函数类型
先声明一个返回Human*的函数指针类型,用于统一各类子类的创建逻辑:
using HumanFactory = Human* (*)();
2. 为每个子类编写工厂函数
每个子类对应一个简单的创建函数,逻辑统一:
Human* createStudent() { return new Student; } Human* createUndergrad() { return new Undergrad; } Human* createWorker() { return new Worker; } Human* createActor() { return new Actor; } Human* createMusician() { return new Musician; }
3. 在Manage类中添加工厂映射表
用数组建立菜单选项和工厂函数的直接映射(因为选项是连续整数,数组比map更高效):
class Manage { private: Human *List[100]; int iObject_num; // 索引对应菜单选项,0留空对应退出,1-5对应各子类 HumanFactory factories[6] = {nullptr, createStudent, createUndergrad, createWorker, createActor, createMusician}; public: // 原有构造函数保持不变 Manage(){ iObject_num=0; }
4. 重构vInList函数,移除Switch-Case
现在可以直接通过选项索引调用对应工厂函数,彻底去掉分支判断:
void vInList() { int choice; do { Menu(); // 菜单仍保留原有6个选项 fflush(stdin); cin>>choice; if (choice == 0) { cout<<"Exiting...\n"; break; } // 检查选项合法性 if (choice >= 1 && choice <= 5 && factories[choice] != nullptr) { List[iObject_num] = factories[choice](); List[iObject_num]->vInPrivate(); List[iObject_num]->vIn(); iObject_num++; } else { cout<<"Invalid!\n"; } } while(choice!=0); }
额外优化建议
- 修复内存泄漏:你的析构函数
delete List;是错误的,List是栈上数组,需要循环删除每个元素:~Manage(){ for (int i = 0; i < iObject_num; i++) { delete List[i]; } } - 改用智能指针:如果C++版本允许,用
std::unique_ptr<Human>替代裸指针,无需手动管理内存:std::unique_ptr<Human> List[100]; // 创建对象时: List[iObject_num] = std::unique_ptr<Human>(factories[choice]()); // 析构函数无需手动delete - 扩展更便捷:新增子类时,只需要添加对应的工厂函数,再在
factories数组中补充对应位置的指针即可,完全不需要修改vInList函数,符合开闭原则。
内容的提问来源于stack exchange,提问作者LilLee
相关产品推荐
相关产品推荐

