使用继承规避开关语句



我有以下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中的每一个编写一个子类?

品味问题。您认为"加号节点"与"减号节点"是不同类型的对象吗?需要考虑的一件事是,您不能修改对象的类,因此通过使它们成为单独的类,您将失去将"加号节点"更改为不同类型的节点的能力。

在这种情况下,添加四个类来摆脱单个 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...

最新更新