【发布时间】:2018-05-09 07:01:11
【问题描述】:
我目前对动态多态性感到困扰。我有一个 switch 语句,它将根据条件执行不同的任务:
switch (condition)
{
case a:
foo();
doSomethingA();
case b:
foo();
doSomethingB();
case c:
foo();
doSomethingC();
}
我想创建一个带有虚拟方法doSomething() 的基础对象,并让这个函数执行BasePtr->doSomething()。
我需要根据这种情况制作一个合适的对象类型,据我所知,我无法避免这种切换。
它只会重构为:
std::unique_ptr<Base> base;
switch (condition)
{
case a:
base = std::make_unique<DerivedA>();
case b:
base = std::make_unique<DerivedB>();
case c:
base = std::make_unique<DerivedC>();
}
base->doSomething();
这似乎不是一个完整的解决方案。此 switch 语句仅使用一次,之后取决于条件的整个逻辑结束。此解决方案不会将进一步的 switch 语句压缩到基本 switch 中,它指示要创建哪个对象。对于这样的问题你怎么看?
【问题讨论】:
-
如果这是类的唯一用途,并且以后再也不会调用“doSomething”,那么我认为首先拥有这些类是没有意义的。还不如继续使用第一版的代码。
-
只是检查,但我认为缺少
break;语句不是故意的。 -
也许可以制作一张地图并将条件作为键并将某事()作为 lambda?
-
工厂方法可以在这里工作,有或没有多态性。
标签: c++ switch-statement polymorphism