使用继承规避 switch 语句

Circumventing switch statement with inheritance

我有下面的C++代码可以用来计算算术表达式。

struct Node
{
  char _operator;
  int _value;
  Node* _previous;
  Node* _next;
  double calculate()
  {
    switch(_operator)
    {
      case '#': return _value;
      case '*': return _previous->calculate() * _next->calculate();
      case '+': return _previous->calculate() + _next->calculate();
      case '-': return _previous->calculate() - _next->calculate();
    }
    return -1;
  }
}

我是 C++ 的新手,我明白对于一般的 OOP,使用继承比使用条件结构更好,尤其是当它们嵌套很深时。

我想知道如何使用继承来转换开关,尽管对于这个例子来说它不可行(会吗?)

我是否声明 calculate 函数 abstract 并为 switch 的四个 case 中的每一个编写一个子类?

品味问题。您认为 "plus node" 与 "minus node" 是不同类型的对象吗?需要考虑的一件事是您无法修改对象的 class,因此通过将它们分开 class,您将失去将 "plus node" 更改为不同类型节点的能力.

在这种情况下,添加四个 classes 来摆脱单个 switch 语句似乎使事情过于复杂。

这是一种方法:

class Expression {
    virtual double calculate() = 0;
}
class Literal : Expression {
    double _value;
    double calculate() {
        return _value;
    }
}
class Operation {
    protected:
        Expression* _previous;
        Expression* _next;
}
class Addition : Operation {
    double calculate() {
        return _previous->calculate() + _next->calculate();
    }
}
class Subtraction : Operation {
    double calculate() {
        return _previous->calculate() - _next->calculate();
    }
}
...and so on...