多態計算器(封裝、繼承、多態、簡單工廠)

一.封裝安全

向對象程序設計中,一個很是重要的技術即是封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。這樣作的好處在於可使類內部的具體實現透明化,只要其餘代碼不依賴類內部的私房數據,你即可以安心修改這些代碼。此外,這樣作也是出於安全方面的考慮,若是表明網上支付卡密碼的變量隨便就能夠被訪問到,這樣的系統誰還敢用呢?ide

訪問修飾符:函數

Private:只有類自己能存取.
Protected:類和派生類能夠存取.
Internal:只有同一個項目中的類能夠存取.
Protected Internal:是Protected和Internal的結合. spa

Public:徹底存取.設計

 

實例代碼 指針

 class Operation             //運算基類
    {
        private double _numberA = 0;
        private double _numberB = 0;


        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }


        public virtual double GetResult()       //定義虛方法
        {
            double result = 0;
            return result;
        }
    }

上面 Operation類中字斷與方法 就實現了一個封裝。code

 

二.多態對象

1、多態:同一操做做用於不一樣的對象,能夠有不一樣的解釋,產生不一樣的執行結果。在運行時,能夠經過指向基類的指針,來調用實現派生類中的方法。blog

編譯時的多態性:

編譯時的多態性是經過重載來實現的。對於非虛的成員來講,系統在編譯時,根據傳遞的參數、返回的類型等信息決定實現何種操做。 

運行時的多態性:

運行時的多態性就是指直到系統運行時,才根據實際狀況決定實現何種操做。C#中,運行時的多態性經過虛成員實現。 

編譯時的多態性爲咱們提供了運行速度快的特色,而運行時的多態性則帶來了高度靈活和抽象的特色。繼承

  2、實現多態:

    1. 接口多態性。
    2. 繼承多態性。
    3. 經過抽象類實現的多態性。

3、override關鍵字:

重寫父類中的virtual修飾的方法,實現多態。

 

三.繼承

 

繼承主要實現重用代碼,節省開發時間。

1、C#中的繼承符合下列規則:

  1. 繼承是可傳遞的。若是C從B中派生,B又從A中派生,那麼C不只繼承了B中聲明的成員,一樣也繼承了A中的成員。Object類做爲全部類的基類。
  2. 派生類應當是對基類的擴展。派生類能夠添加新的成員,但不能除去已經繼承的成員的定義。
  3. 構造函數和析構函數不能被繼承。除此以外的其它成員,不論對它們定義了怎樣的訪問方式,都能被繼承。基類中成員的訪問方式只能決定派生類可否訪問它們。
  4. 派生類若是定義了與繼承而來的成員同名的新成員,就能夠覆蓋已繼承的成員。但這並不由於這派生類刪除了這些成員,只是不能再訪問這些成員。
  5. 類能夠定義虛文法、虛屬性以及虛索引指示器,它的派生類可以重載這些成員,從而實現類能夠展現出多態性。

2、new關鍵字

若是父類中聲明瞭一個沒有friend修飾的protected或public方法,子類中也聲明瞭同名的方法。則用new能夠隱藏父類中的方法。(不建議使用)

3、base關鍵字

base 關鍵字用於從派生類中訪問基類的成員:

  1. 調用基類上已被其餘方法重寫的方法。
  2. 指定建立派生類實例時應調用的基類構造函數

 

子類繼承基類,並重寫父類計算虛方法

 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)
                result = NumberA / NumberB;
            else
                Console.WriteLine("除數不能爲零!\n");
            return result;
        }
    }
運算對象生產工廠
 class OperationFactory      //運算對象生產工廠
    {
        public static Operation createOperation(string operation)
        {
            Operation oper = null;

            switch(operation)
            {
                case "+":
                    {
                        oper = new OperationAdd();
                        break;
                    }
                case "-":
                    {
                        oper = new OperationSub();
                        break;
                    }
                case "*":
                    {
                        oper = new OperationMul();
                        break;
                    }
                case "/":
                    {
                        oper = new OperationDiv();
                        break;
                    }
            }

            return oper;
        }
    }

Main方法

class Program
    {
        static void Main(string[] args)
        {
            Operation oper;

            Console.WriteLine("請輸入運算符:\r\n");
            oper = OperationFactory.createOperation(Console.ReadLine());//調用簡單工廠類
            Console.WriteLine("請輸入第一個數:\r\n");
            oper.NumberA = int.Parse(Console.ReadLine());
            Console.WriteLine("請輸入第二個數:\r\n");
            oper.NumberB = int.Parse(Console.ReadLine());

            double result = oper.GetResult();
            Console.WriteLine("運算結果:\r\n");
            Console.WriteLine(oper.NumberA.ToString() +"+"+ oper.NumberB.ToString() + "=" + result.ToString());
            Console.ReadLine();
        }

簡單計算器的類圖

相關文章
相關標籤/搜索