4.7.2 多态案例一-计算器类
案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:
- 代码组织结构清晰
- 可读性强 T
- 利于前期和后期的扩展以及维护
普通写法
// Calculate.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include<string>
using namespace std;
class Calculate
{
public:
Calculate(){}
~Calculate(){}
int getRestlt(string oper)
{
if (oper == "+")
{
return m_Num1 + m_Num2;
}
else if (oper == "-")
{
return m_Num1 - m_Num2;
}
else if (oper == "*")
{
return m_Num1 * m_Num2;
}
else if (oper == "/")
{
if (m_Num2 == 0)
{
cout << "分母为0!" << endl;
}
else
{
return m_Num1 / m_Num2;
}
}
}
int m_Num1;
int m_Num2;
private:
};
void test01()
{
//如果想要扩展功能,那么需要查看原始地方的所有代码,进行修改
//因此,在真实开发中,不提倡这种写法,一般提倡 “开闭原则”
//“开闭原则”-对扩展进行开放,对修改进行关闭
Calculate c;
c.m_Num1 = 10;
c.m_Num2 = 20;
cout << c.m_Num1 << "+" << c.m_Num2 << "=" << c.getRestlt("+") << endl;
cout << c.m_Num1 << "-" << c.m_Num2 << "=" << c.getRestlt("-") << endl;
cout << c.m_Num1 << "*" << c.m_Num2 << "=" << c.getRestlt("*") << endl;
cout << c.m_Num1 << "/" << c.m_Num2 << "=" << c.getRestlt("/") << endl;
}
int main()
{
test01();
std::cout << "Hello World!\n";
}
//如果想要扩展功能,那么需要查看原始地方的所有代码,进行修改
//因此,在真实开发中,不提倡这种写法,一般提倡 “开闭原则”
//“开闭原则”-对扩展进行开放,对修改进行关闭
利用多态实现的计算器
class AbstractCalculator
{
public:
virtual int getResult()
{
return 0;
}
int m_Num1;
int m_Num2;
};
//加法
class AddCalculate:public AbstractCalculator
{
public:
int getResult()
{
return m_Num1+ m_Num2;
}
};
//减法
class SubCalculate :public AbstractCalculator
{
public:
int getResult()
{
return m_Num1 - m_Num2;
}
};
//乘法
class MulCalculate :public AbstractCalculator
{
public:
int getResult()
{
return m_Num1 * m_Num2;
}
};
//除法
class DivCalculate :public AbstractCalculator
{
public:
int getResult()
{
if (m_Num2 != 0)
{
return m_Num1 / m_Num2;
}
else
{
cout << "除数为0!" << endl;
}
}
};
int doProcessCalculate(AbstractCalculator &cal)
{
return cal.getResult();
}
void test02()
{
//方法1:使用引用方式传递对象
/*
AddCalculate add;
add.m_Num1 = 100;
add.m_Num2 = 200;
cout << add.m_Num1 << "+" << add.m_Num2 << "=" << doProcessCalculate(add) << endl;
*/
//方法2:使用指针方式传递对象
AbstractCalculator *abc = new AddCalculate;
abc->m_Num1 = 100;
abc->m_Num2 = 200;
cout << abc->m_Num1 << "+" << abc->m_Num2 << "=" << abc->getResult() << endl;
//使用完记得销毁堆区的对象
delete abc;
abc = new SubCalculate;
abc->m_Num1 = 100;
abc->m_Num2 = 200;
cout << abc->m_Num1 << "-" << abc->m_Num2 << "=" << abc->getResult() << endl;
//使用完记得销毁堆区的对象
delete abc;
abc = new MulCalculate;
abc->m_Num1 = 100;
abc->m_Num2 = 200;
cout << abc->m_Num1 << "*" << abc->m_Num2 << "=" << abc->getResult() << endl;
//使用完记得销毁堆区的对象
delete abc;
abc = new DivCalculate;
abc->m_Num1 = 100;
abc->m_Num2 = 200;
cout << abc->m_Num1 << "/" << abc->m_Num2 << "=" << abc->getResult() << endl;
//使用完记得销毁堆区的对象
delete abc;
}
int main()
{
//test01();
test02();
std::cout << "Hello World!\n";
}
多态好处:
1、组织结构清晰
2、可读性强