使用继承规避 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...
我有下面的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...