物件導向三大特性-----封裝、繼承、多型

小世界的野孩子發表於2019-07-23

前言

  前面有文章寫到了物件導向程式設計和麵向物件設計的頭五大原則(SOLID五大原則)。今天我們再來談談物件導向的三大特性--封裝、繼承、多型

封裝

   被定義為"把一個或多個專案封閉在一個物理的或者邏輯的包中"。在物件導向程式設計方法論中,封裝是為了防止對實現細節的訪問。封裝只公開某些對外介面,隱藏具體實現細節。增加了一定的安全性,防止資訊的洩露以及破壞。

  講到封裝,我們又得提下訪問修飾符了。

    • public:所有物件都可以訪問;
    • private:物件本身在物件內部可以訪問;
    • protected:只有該類物件及其子類物件可以訪問
    • internal:同一個程式集的物件可以訪問;
    • protected internal:訪問限於當前程式集或派生自包含類的型別。

繼承

  繼承是軟體複用的一種形式。使用繼承可以複用現有類的資料和行為,為其賦予新功能而建立出新類。 

  在現有類(基類、父類)上建立新類(派生類、子類)的處理過程稱為繼承。派生類能自動獲得基類的除了建構函式和解構函式以外的所有成員,可以在派生類中新增新的屬性和方法擴充套件其功能

  這裡繼承又可分為以下系列:

    • 單重繼承:表示一個類可以派生自一個基類,C#採用此繼承
    • 多重繼承:多重繼承允許一個類派生自多個類,C#不支援多重繼承,但允許介面的多重繼承
    • 多層繼承:多層繼承允許有更大的層此結構,類B派生自類A,類C派生自類B,其中,類B也稱為中間基類,C#支援它,也很常用。
    • 介面繼承:允許介面多重繼承

多型

  多型指在程式設計中存在同名不同方法的存在,主要通過子類對父類的覆蓋來實現多型,設計原則之一就是要依賴於抽象,而不依賴於具體,增加靈活性。多型就是為了體現這一原則。

例項講解

  這裡我們假設一個場景,對圖形的面積進行計算。在這裡我們就抽象一個基類,形狀。然後其他的設計都來繼承它。

    類設計

    

    /// <summary>
    /// 抽象類
    /// </summary>
    public abstract class Shape
    {
        private string ShapeName { get; set; }
        public Shape(string shapeName)
        {
            this.ShapeName = shapeName;
        }

        /// <summary>
        /// 計算面積
        /// </summary>
        /// <returns></returns>
        public abstract double CalculateArea();
    }

 

    /// <summary>
    /// 長方形
    /// </summary>
    public class Rectangle:Shape
    {
        /// <summary>
        ////// </summary>
        public double Longm { get; set; }
 

        /// <summary>
        ////// </summary>
        public double Widem { get; set; }
        public Rectangle():base("Rectangle")
        {
            Longm = 0;
            Widem=0;
        }

        public override double CalculateArea()
        {
            return Longm * Widem;
        }
    }
    /// <summary>
    /// 圓形
    /// </summary>
    public class Circle: Shape
    {
        /// <summary>
        /// 半徑
        /// </summary>
        public double R { get; set; }

       
        public Circle(): base("Circle ")
        {
            R = 0;
        }

        public override double CalculateArea()
        {
            return Math.PI*R*R;
        }
    }

   呼叫

   

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("請選擇計算面積的圖形:長方形(A)/圓形(B)");
            string answer = Console.ReadLine();
            if (answer=="A")
            {
                double longm=0;
                double widem = 0;
                try
                {
                    Console.WriteLine("請輸入長:");
                     longm = double.Parse(Console.ReadLine());
                    Console.WriteLine("請輸入寬:");
                     widem = double.Parse(Console.ReadLine());
                }
                catch (Exception)
                {
                    Console.WriteLine("請輸入數字!");
                }

                Rectangle rectangle = new Rectangle();
                rectangle.Longm = longm;
                rectangle.Widem = widem;
                Console.WriteLine($"此長方形的面積是{rectangle.CalculateArea()}");
            }
            else
            {
                double r=0;
                try
                {
                    Console.WriteLine("請輸入半徑:");
                 r = int.Parse(Console.ReadLine());
                }
                catch (Exception)
                {
                    Console.WriteLine("請輸入數字!");
                }
                Circle circle = new Circle();
                circle.R = r;
                Console.WriteLine($"此圓形的面積是{circle.CalculateArea()}");
            }
        }
    }

總結

   本個案例實際作用不是很大,主要是方便講解理解封裝繼承多型,在例項中,對圖形的名稱封裝,抽象一個抽象類圖形基類,圓形和長方形繼承此基類。override 重寫實現面積計算的多型。更多的還是需要在實際專案中實際運用的。

 

  


                      c#基礎知識詳解系列

 

  歡迎大家掃描下方二維碼,和我一起學習更多的C#知識

 

  

相關文章