一个面像对像的计算器

 

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值