【问题标题】:Switch statements and polymorphismSwitch 语句和多态性
【发布时间】: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


【解决方案1】:

它尽可能紧凑。您需要一种方法来配置您的基础,并且在您的情况下,您使用了 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();

【讨论】:

  • 这与 OP 的例子没有太大区别,只是 OP 的解决方案通过使用智能指针更好
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多