C# 面向對象:封裝、繼承、多態

来源:http://www.cnblogs.com/weixinyuai/archive/2016/03/21/5303611.html
-Advertisement-
Play Games

面向對象有封裝、繼承、多態這三個特性,面向對象編程按照現實世界的特點來管理複雜的事物,把它們抽象為對象,具有自己的狀態和行為,通過對消息的反應來完成任務。這種編程方法提供了非常強大的多樣性,大大增加了代碼的重用機會,增加了程式開發的速度,將具備獨立性特製的程式代碼包裝起來,修改部分程式代碼時不至於會


面向對象有封裝、繼承、多態這三個特性,面向對象編程按照現實世界的特點來管理複雜的事物,把它們抽象為對象,具有自己的狀態和行為,通過對消息的反應來完成任務。這種編程方法提供了非常強大的多樣性,大大增加了代碼的重用機會,增加了程式開發的速度,將具備獨立性特製的程式代碼包裝起來,修改部分程式代碼時不至於會影響到程式的其他部分。

 

1.封裝

每個對象都包含它進行操作所需要的所有信息,封裝只公開代碼單元的對外介面,而隱藏其具體實現,儘量不對外公開代碼。使用封裝有很多好處,從設計角度來講,封裝可以對外屏蔽一些重要的信息,比如使用電腦的人只要知道怎麼使用電腦就可以,不用知道這些功能具體是怎麼實現的;從安全性考慮,封裝使對代碼的修改更加安全和容易,封裝明確的指出了哪些屬性和方法是外部可以訪問的,這樣當需要調整這個類的代碼時,只要保證公有屬性不變,公有方法的參數和返回值類型不變,那麼就可以盡情的修改這個類,而不會影響到程式的其他部分;封裝還避免了命名衝突的問題,封裝有隔離作用,不同的類中可以有相同名稱的方法和屬性,但不會混淆,也可以減少耦合。

 

2.繼承

繼承可以使用現有類的所有功能,併在無須重新編寫原來的類的情況下,對這些功能進行擴展。使用繼承而產生的類被稱為派生類或子類,而被繼承的類則稱為基類或超類或父類。繼承表示一個類型派生於一個基類型,它擁有該基類型的所有成員欄位和函數,其子類是對父類的擴展;介面繼承是表示一個類型只繼承了函數的簽名,沒有繼承任何實現代碼。繼承劃分了類的層次性,也可以說繼承是對類的分組,父類代表的是抽象的類,更常用的類,而子類代表的是更為具體,更為細化的類;繼承是實現代碼重用、擴展的重要手段。所謂抽象的類是指與具體的事項相聯繫,但只是表達整體而不是具體概念的類,比如說形狀包含正方形、長方形、圓等,這時候形狀是一個抽象的概念,相當於一個父類,而正方形、長方形、圓是具體的形狀,相當於是子類。

 

3.多態

多態是指程式中同名的不同方法共存的情況,主要通過子類對父類方法的覆蓋來實現多態。這樣,不同類的對象可以用同名的方法完成特定的功能,但具體的實現方法卻可以不同。比如說形狀包含正方形、長方形、圓等,每個形狀都有面積和周長,但是不同的形狀計算面積和周長的方法都不同。

 

下麵就舉個例子來說明封裝、繼承、多態:

這個例子的基類,就是上面描述概念的時候提到的形狀,形狀是基類,而這個基類是個抽象的概念,而不是具體的,因此是抽象類,此類包含屬性形狀名稱、輸出形狀周長和麵積的方法以及計算形狀周長和麵積的抽象方法:

    /// <summary>
    /// 形狀基類
    /// </summary>
    public abstract class Shape
    {
        /// <summary> 
        /// 形狀名稱
        /// </summary>
        public string ShapeName { get; private set; }

        public Shape(string shapeName)
        {
            ShapeName = shapeName;
        }

        /// <summary>
        /// 輸出形狀周長
        /// </summary>
        public virtual void PrintPerimeter(double perimeter)
        {
            Console.WriteLine(ShapeName + " Perimeter: " + perimeter);
        }

        /// <summary>
        /// 輸出形狀面積
        /// </summary>
        public virtual void PrintArea(double area)
        {
            Console.WriteLine(ShapeName + " Area: " + area);
        }

        /// <summary>
        /// 計算形狀周長
        /// </summary>
        /// <returns></returns>
        public abstract double CalculatePerimeter();

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

 

下麵再來看具體的子類,子類是圓,包含屬性半徑、計算周長和麵積的方法:

    /// <summary>
    ////// </summary>
    public class Circle : Shape
    {
        /// <summary>
        /// 圓的半徑
        /// </summary>
        public double R { get; set; }

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

        /// <summary>
        /// 圓的周長
        /// </summary>
        /// <returns></returns>
        public override double CalculatePerimeter()
        {
            return 2 * Math.PI * R;
        }

        /// <summary>
        /// 圓的面積
        /// </summary>
        /// <returns></returns>
        public override double CalculateArea()
        {
            return Math.PI * R * R;
        }
    }

 

再來看看長方形,包含屬性高度和寬度、計算周長和麵積的方法:

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

        /// <summary>
        /// 長方形的高度
        /// </summary>
        public double Height { get; set; }

        public Rectangle()
            : base("Rectangle")
        {
            Width = 0;
            Height = 0;
        }

        /// <summary>
        /// 長方形的周長
        /// </summary>
        /// <returns></returns>
        public override double CalculatePerimeter()
        {
            return (Width + Height) * 2;
        }

        /// <summary>
        /// 長方形的面積
        /// </summary>
        /// <returns></returns>
        public override double CalculateArea()
        {
            return Width * Height;
        }
    }

 

以下是調用的代碼:

            Circle circle = new Circle();
            circle.R = 20;

            Square square = new Square();
            square.Edge = 10;

            Rectangle rectangle = new Rectangle();
            rectangle.Width = 20;
            rectangle.Height = 30;

            // 把子類賦給父類,能更好的體現多態性
            IList<Shape> shapeList = new List<Shape>();
            shapeList.Add(circle);
            shapeList.Add(square);
            shapeList.Add(rectangle);

            foreach (var shape in shapeList)
            {
                shape.PrintPerimeter(shape.CalculatePerimeter());
                shape.PrintArea(shape.CalculateArea());
            }

 

在此例子中,輸出形狀的周長和麵積的方法沒有太大作用,是因為方法的具體實現比較簡單,如果是複雜的方法時會有很大作用。比如說想要實現拖拽功能,每個形狀都是可以拖拽的,而且每個形狀拖拽的方法都會是一樣的,但是想要實現拖拽功能可不像輸出這麼簡單,這時候子類可以繼承父類的方法,直接調用。

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.關掉mysql服務,打開系統設置最後的mysql,然後將mysql先關掉 2.生成一個文件命名mysql-init,文件中放入:一句話,這句話不同版本不一樣,如下:(括弧裡面不包含) alter user ‘root’@‘localhost’ identified by ‘新密碼’;(MySQL
  • 參照Hadoop.The.Definitive.Guide.4th的例子,執行SortDataPreprocessor作業時失敗,輸出的錯誤信息 SequenceFile doesn't work with GzipCodec without native-hadoop code! 根據提示初步猜測
  • J-Link RTT的實現
  • 一、操作系統級環境及軟體版本 操作系統:CentOS release 6.5 (Final)minimal 內核版本:2.6.32-431.el6.x86_64 MySQL版本:MySQL-5.6.28 nginx版本:nginx-1.8.1 php版本:php-5.6.19 二、安裝MySQL-5
  • 問題表現: 在明明引用了頭文件的情況下,出現“undefined reference to `…'”的情況,例如下圖: 解決方法: 在左邊的數據目錄定位到“system\src\stm32f0-stdperiph”,然後找到需要的“*.c”文件,包括進去即可。
  • s3c2440的i2c控制器驅動(精簡DIY),直接上代碼,註釋很詳細: 附一份測試程式: Make File:
  • 近段時間在做一個IETM的項目,項目需要使用WebBrower對包含avi的xml進行顯示,可avi的顯示總是有問題,網上找到這段在html中播放avi的代碼,在Win10上表現不錯,明天上班用Win7的機器試試。Windows Media Player總是有各種意想不到的問題,實在頭痛。 使用wi
  • 文章主要介紹使用ITextSharp導出PDF表格和圖片的簡單操作說明,以下為ITextSharp.dll下載鏈接 分享鏈接:http://pan.baidu.com/s/1nuc6glj 密碼:3gxw 一、流程 二、簡單實例: 1)創建表格實例 程式: 樣式: 2)創建圖片 程式: 樣式:
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...