面向对象改造——50道100以内的加减法口算习题
接上篇文章,50道100以内的加减法口算习题的模块化改造基础上,对其进行面向对象的进一步改造
上文链接: link.
文章目录
前言
上文中所提到的模块化是在函数级,通过函数间的交互表示程序结构、分配程序功能,暂时忽略了函数的内部实现。
而本文所讲到的面向对象技术把数据及其操作封装在一个对象中,并把具有相同属性(数据名称)和方法(函数)的所有对象抽象成类,使得能在比函数更抽象、更大程序单元粒度的层次上进行软件开发。
提示:以下是本篇文章正文内容,下面案例可供参考
一、算式类BinaryOperation
1.设计原则
类 BinaryOperation
• 把其中的公共部分抽象出来,把差异部分细化成BinaryOperation 的两个子类:
– 加法算式AdditionOperation
– 减法算式SubstractOperation
• 每个类叧负责完成各自单一的功能,两个子类相互独立。
• 这样的程序结构还便于程序扩展,如增加乘法、除法子类,不影响已经存在的类。
基类BinaryOperation 设计成抽象类。
• 子类AdditionOperation 和SubstractOperation
• 在基类中定义抽象斱法int calculate()返回运算式的计算结果,抽象方法boolean checkingCalculation()检查运算结果。具体实现则分别在两个子类中。
2.UML图
3.代码实现
① BinaryOperation算式类
/**
* 采用面向对象的设计原则,使软件更易扩展、更易更新、更易维护
*/
import java.util.Random;
/**
* 算式类BinaryOperation,抽象父类,封装算式通用的属性和方法
* @author lenovo
*
*/
public abstract class BinaryOperation{
static final int UPPER = 100; //加法约束
static final int LOWER = 0; //减法约束
private int left_operand = 0; // 左操作数
private int right_operand = 0; // 右操作数
private char operator; // 操作符
private int value; // 算式的结果
abstract int calculate(int left, int right); //抽象方法:算式的计算,由子类实现
abstract boolean checkingCalculation(int anInteger); // 抽象方法,检验计算结果,子类负责实现
protected void generateBinaryOperation(char anOperator) {
int left, right, result;
Random random = new Random();
do {
left = random.nextInt(UPPER+1); //产生左操作数
right = random.nextInt(UPPER+1); //产生右操作数
result = calculate(left, right);
}while(!checkingCalculation(result));
left_operand = left;
right_operand = right;
operator = anOperator;
value = result;
}
/**
* 获取左操作数
* @return 获取值
*/
public int getLefOperand() {
return left_operand;
}
/**
* 获取右操作数
* @return 获取值
*/
public int getRightOperand()