我目前对动态多态感到困扰。我有一个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语句压缩到基本开关中,这表示要创建的对象。你怎么看待这个问题?
答案 0 :(得分:0)
它尽可能紧凑。你需要一种方法来配置你的基础,在你的情况下你使用了一个switch-case。
考虑下面的例子......
Pokemon* pokemon;
switch( mySelection ){
case 1: pokemon = new Pikachu(); break;
case 2: pokemon = new Bulbasaur(); break;
case 3: pokemon = new Charmander(); break;
default: pokemon = null;
}
if (pokemon!=null)
pokemon-> specialAttack();