一个面像对像的计算器

来源:互联网 发布:怎么买到淘宝客户信息 编辑:程序博客网 时间:2024/04/28 15:02

 

       今天看了程杰老师的《大话模式设计》的第一章,对面像对像的认识又上了一个台阶,特别是那个控制台的计

算器让我感受很深,所以想贴出来让家末共同学习:

    在这里即使是一个小小的计算器也使用了面像对像的三大特性:封装,继承,多态.。。呵呵,这是我以前一直

都想不通的问题,因为以前也有人叫我用面像对像的方式去写一个控制台,但就是写来写去也用不到面像对像,用

他们的话说就是:喊着面像对像的口号,却用着面像过程的思维。我认为这句话真的很值得我们这些“面像对像的

程序员“去思考。好了。。先看作者建的一个 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();                    }    }}
原创粉丝点击