上一篇博客主要是在理论上介绍面向对象编程,下面通过一个计算器的实例来学习面向对象的好处。
按照面向对象的三大特征:
对事物的状态和行为的细节封装,这样就形成了一个可以重复使用的“零件”,这样就使得我们写的代码可复用,下面是计算器的代码展示,把计算器的业务逻辑与界面逻辑分开:
///业务逻辑——OPeration运算类
public class Operation
{
public static double GetResult(double numberA, double numberB, string operate)
{
double result = 0d;
switch (operate) ///给运算类(+、-、*、/)定义
{
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
return result;
}
}
///界面逻辑——客户端代码
static void Main (string[] args)
{
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
///对界面进行设计定义
try
{
Console.Write("请输入数字A:");
string strNumberA = Console.ReadLine();
Console.Write("请选择运算符号(+、-、*、/):");
string strOperate = Console.ReadLine();
Console.Write("请输入数字B:");
string strNumberB=Console.ReadLine();
string strResult="";
strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));
Console.WriteLine("结果是:" + strResult);
Console.ReadLine();
}
catch (Exception ex) ///错误信息提示
{
Console.WriteLine("您的输入有错:" + ex.Message);
}
}
这样,我们就可以自由的修改类的内部,用户如果想写一个其他版的程序,既可以直接复用这个Operation运算类。
class OperationAdd : Operation ///加法类,继承运算类
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
class OperationSub : Operation ///减法类,继承运算类
{
public override double GetResult()
{
double result = 0;
result = NumberA -NumberB;
return result;
}
}
class OperationMul : Operation ///乘法类,继承运算类
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
class OperationDiv : Operation ///除法类,继承运算类
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
throw new Exception("除数不能为0.");
result = NumberA / NumberB;
return result;
}
}
加减乘除是运算方法类,运行时的代码大部分都相同,把相同的代码都放到父类运算类(OPeration)中,这样写代码的时候重复的部分就可以不用写,直接从父类中继承就行,而且如果不用继承,当你修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能就越大。
我们建一个简单运算工厂,这个工厂的功能生产各种运算,加减乘除,平方根,立方根,自然对数,正弦余弦...
public class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate ) ///定义新的运算
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
各种运算都是子类,他们都有一个共同的父类运算类(Operation),虽然每一种运算也是一种类,但是他们的最终结果是把几个数的运算结果算出来。
这样我们就实现了我们所写的程序可维护、可扩展、可复用、灵活性好的功能。