今天看了程杰老师的《大话模式设计》的第一章,对面像对像的认识又上了一个台阶,特别是那个控制台的计
算器让我感受很深,所以想贴出来让家末共同学习:
在这里即使是一个小小的计算器也使用了面像对像的三大特性:封装,继承,多态.。。呵呵,这是我以前一直
都想不通的问题,因为以前也有人叫我用面像对像的方式去写一个控制台,但就是写来写去也用不到面像对像,用
他们的话说就是:喊着面像对像的口号,却用着面像过程的思维。我认为这句话真的很值得我们这些“面像对像的
程序员“去思考。好了。。先看作者建的一个 OperateBase.cs 文件中写了哪些类:
using System;
using System.Collections.Generic;
using System.Text;
//业务逻辑代码
namespace Console1
{
public class OperateBase//写一个基类,用于被继承,记住:如果是基类,则前面的Public一定不能少
{
private double _numberA;
private double _numberB;//声明为私有变量,即使是派生类也不能直接使用它
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
//再写一个虚方法,以便继承类可以重写
public virtual double GetRuslut()
{
double result = 0;
return result;
}
}
class OperateAdd : OperateBase//写一个加法类,继承基类,并重写GetRuslut()方法
{
public override double GetRuslut()
{
return NumberA + NumberB;
}
}
class OperteSub : OperateBase//写一个减法类,继承基类,并重写GetRuslut()方法
{
public override double GetRuslut()
{
return NumberA - NumberB;
}
}
class OperateMul : OperateBase//写一个乘法类,继承基类,并重写GetRuslut()方法
{
public override double GetRuslut()
{
return NumberA * NumberB;
}
}
class OperateDiv : OperateBase//写一个除法类,继承基类,并重写GetRuslut()方法
{
public override double GetRuslut()
{
if (NumberB == 0)
{
throw new Exception("除数不能为0"); }
return NumberA / NumberB;
}
}
public class GetOperateMethod //用作者的话说,这是一个简单工厂模式
{
public static OperateBase GetMethod(string operateMethod)
{
OperateBase Oper = null;
switch (operateMethod)
{
case "+":
{
Oper = new OperateAdd();
} break;
case "-":
{
Oper = new OperteSub();
} break;
case "*":
{
Oper = new OperateMul();
} break;
case "/":
{
Oper = new OperateDiv();
}break ;
default:
{
throw new Exception("输入操作符号错误 ");
}
}
return Oper;
}
}
}
再来看看客户端代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace Console1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入数A:");
string numberA = Console.ReadLine();
Console.WriteLine("请输入数B:");
string numberB = Console.ReadLine();
Console.WriteLine("请输入操作符:");
string opereate = Console.ReadLine();
string result = "";
OperateBase Oper = GetOperateMethod.GetMethod(opereate);
try
{
Oper.NumberA = Convert.ToDouble(numberA);
Oper.NumberB = Convert.ToDouble(numberB);
}
catch
{
Console.WriteLine("输入字符类型错误 ");
}
result = Oper.GetRuslut().ToString();
Console.WriteLine(result);
Console.ReadLine();
}
}
}