面向對象

封裝:把細節屏蔽,只留一個功能。

繼承:複用,拿來主義。

多態:同一種行爲,針對不同的對象,得到不同的結果。

            同一個對象,得到不同的狀態。

面向過程:一步步的解決問題,親自親爲。

面向對象:你需要完成某件事,你就去找一個對象,讓它去完成(你要計算,那就從兜裏掏出手機,打開計算器就可以了)。

面向過程到面向對象的轉變就是“執行者”到“命令者”的轉變。


Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise
{
    class Program
    {
        static void Main(string[] args)
        {
            //面向過程的計算器
            Console.WriteLine("請輸入第一個數:");
            double dNum1 = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("請輸入第二個數:");
            double dNum2 = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("請輸入運算符(+,-,*,/):");
            string oper = Console.ReadLine(); // operation 運算

            double res = 0;
            bool isRight = true; // 是對的
            switch (oper)
            {
                case "+": res = dNum1 + dNum2; break;
                case "-": res = dNum1 - dNum2; break;
                case "*": res = dNum1 * dNum2; break;
                case "/": res = dNum1 / dNum2; break;
                default: isRight = false; break;
            }

            if (isRight)
                Console.WriteLine("{0} {1} {2} = {3}", dNum1, oper, dNum2, res);
            else
                Console.WriteLine("運算符出錯");

            // 面向對象的計算器
            // 你要計算
            // 從兜裏掏出手機來,打開計算器
            //計算器對象 = new 計算器();
            //計算器對象.使用();
            Calculator cal = new Calculator();
            cal.Start();
        }
    }
}
Calculator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise
{
    class Calculator
    {
        //定義字段
        double dNum1;
        double dNum2;
        string oper;

        //Start開始
        public void Start() 
        {
            while (true)
            {
                //輸入數字與運算符
                Input();
                //計算
                Calculating();

                Console.Write("是否繼續(yes,no):");
                if (Console.ReadLine() == "no") break;

            }
        }
        private void Input() 
        {
            dNum1 = InputNumber("請輸入第一個數:");
            dNum2 = InputNumber("請輸入第二個數:");
            oper = InputOperation("請輸入運算符(+,-,*,/):", "+,-,*,/".Split(','));
        }
        private void Calculating() 
        {
            double res=0;
            //switch (oper)
            //{
            //    case "+":res = dNum1 + dNum2;break;
            //    case "-":res = dNum1 + dNum2;break;
            //    case "*":res = dNum1 + dNum2;break;
            //    case "/":res = dNum1 + dNum2;break;
            //    default:  break;
            //}
            //Console.WriteLine("{0}{1}{2}={3}", dNum1, oper, dNum2, res);

            res=Factory.CreatorInstance(oper).計算(dNum1, dNum2);
            Console.WriteLine("{0}{1}{2}={3}", dNum1, oper, dNum2, res);
        }
        private double InputNumber(string msg) 
        {
            while (true)
            {
                Console.WriteLine(msg);
                string sNum1 = Console.ReadLine();
                double fNum1;
                if (double.TryParse(sNum1,out fNum1))
                {
                    return fNum1;
                }
            }
        }
        private string InputOperation(string msg,string[] operation) 
        {
            while (true)
            {
                Console.WriteLine(msg);
                string oper = Console.ReadLine();
                if (operation.Contains(oper))
                {
                    return oper;
                }
                else {
                    Console.WriteLine("運算符不存在");
                }
            }
            
        }
    }
}
Factory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise
{
    class Factory 
    {
        public static CalculatorBase CreatorInstance(string oper) 
        {
           CalculatorBase cal=null;
           switch (oper)
           {
               case "+": cal = new Addition(); break;
               case "-": cal = new Substraction(); break;
               case "*": cal = new Myltiplication(); break;
               case "/": cal = new Division(); break;
               default:
                   break;
           }

           return cal;
        }
    }
    class CalculatorBase
    {
        public virtual double 計算(double dNum1,double dNum2)
        {
            // 不知道寫什麼,但是又不能返回有效數據,但是不反回又報錯
            // 拋異常
            throw new Exception("exception...");
        }
    }
    class Addition:CalculatorBase
    {
        public override double 計算(double dNum1, double dNum2)
        {
            return dNum1+ dNum2;
        }
    }
    class Substraction : CalculatorBase
    {
        public override double 計算(double dNum1, double dNum2)
        {
            return dNum1 - dNum2;
        }
    }
    class Myltiplication : CalculatorBase
    {
        public override double 計算(double dNum1, double dNum2)
        {
            return dNum1 * dNum2;
        }
    }
    class Division : CalculatorBase
    {
        public override double 計算(double dNum1, double dNum2)
        {
            return dNum1 / dNum2;
        }
    }
}


發佈了87 篇原創文章 · 獲贊 6 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章