问题:现在实现一个计算器功能,输入两个数和操作符,求两个数操作之后的结果。
于是可以有这样一份代码:
switch (ch)
{
case '+':
...
}
改进:使用面向对象的思想,让操作和实现分离,从而使得程序更加灵活,容易修改,并且易于复用。
设计出这样的一个类:
class operation
{
public:
int getresult(int a, int b, char ch)
{
int c = 0;
switch (ch)
{
case '+':
c = a + b;
break;
....
}
return c;
}
};
优点:实现了操作和实现的分离。
缺点:仅仅用到了面对对象三大特征中的封装这一个特性,没有用到多态和继承;如果要增加新功能就得大改代码,重新编译,这是很不划算的。
改进方法:无论是加减乘除还是其他新的操作,归结起来都是对两个数进行操作,得到一个结果,因此可以定义一个操作,加减乘除操作都是继承该操作。
#include <iostream>
#include <string>
using namespace std;
class Operation
{
public:
double A, B;
virtual double getResult()//
{
return 0;
}
virtual ~Operation()
{
}
};
class AddOperation :public Operation
{
public:
double getResult()
{
return A + B;
}
};
class SubOperation :public Operation
{
public:
double getResult()
{
return A - B;
}
};
class MulOperation :public Operation
{
public:
double getResult()
{
return A * B;
}
};
class DivOperation :public Operation
{
public:
double getResult()
{
if (abs(B) < 1.0e-8)
{
cout << "error" << endl;
return 0;
}
else
{
return A / B;
}
}
};
class OperationFactory
{
public:
static Operation* createoperator(char ch)
{
switch (ch)
{
case '+':
return new AddOperation();
break;
case '-':
return new SubOperation();
break;
case '*':
return new MulOperation();
break;
case '/':
return new DivOperation();
break;
default:
break;
}
return nullptr;
}
};
int main()
{
Operation* op = OperationFactory::createoperator('+');
op->A = 10;
op->B = 20;
cout << op->getResult() << endl;
delete op;
}