C#面向對象之多態

来源:https://www.cnblogs.com/yaojieyuan/archive/2019/09/25/11587026.html
-Advertisement-
Play Games

一、多態 多態是從繼承中引出來的概念,即不同的派生類對基類的相同方法表現出不同的行為。如下麵例子中動物的游泳方法: 當用戶使用派生類雞的游泳方法時,由於基類的游泳方法滿足雞的需求,則直接調用基類的游泳方法返回不會;當用戶使用派生類狗和蛙的游泳方法時,由於基類的游泳方法的實現不滿足狗和蛙的需求,所以狗 ...


一、多態

  多態是從繼承中引出來的概念,即不同的派生類對基類的相同方法表現出不同的行為。如下麵例子中動物的游泳方法:

 1 /// <summary>
 2 /// 動物
 3 /// </summary>
 4 public class Animal
 5 {
 6     public string Swimming()
 7     {
 8         return "不會";
 9     }
10 }
11 /// <summary>
12 ///13 /// </summary>
14 public class Chicken : Animal
15 {
16 
17 }
18 /// <summary>
19 ///20 /// </summary>
21 public class Dog : Animal
22 {
23 }
24 /// <summary>
25 ///26 /// </summary>
27 public class Frog : Animal
28 {
29 }

當用戶使用派生類雞的游泳方法時,由於基類的游泳方法滿足雞的需求,則直接調用基類的游泳方法返回不會;當用戶使用派生類狗和蛙的游泳方法時,由於基類的游泳方法的實現不滿足狗和蛙的需求,所以狗和蛙需要實現自己的邏輯。如何實現狗的狗刨和蛙的蛙泳?答案是重寫(使用關鍵字virtual和override在派生類中重新實現基類的同名方法)。

 1 public class Animal
 2 {
 3     //設計基類時對需要在派生類中重寫的方法使用virtual修飾,使用virtual修飾的方法叫做虛方法
 4     public virtual string Swimming()
 5     {
 6         return "不會";
 7     }
 8 }
 9 public class Dog : Animal
10 {
11     //派生類若要重寫基類的方法,可使用override修飾與基類同名的方法,實現自己的行為,被override修飾的方法也可被重寫
12     public override string Swimming()
13     {
14         return "狗刨";
15     }
16 }
17 public class Frog : Animal
18 {
19     //派生類若要重寫基類的方法,可使用override修飾與基類同名的方法,實現自己的行為,被override修飾的方法也可被重寫
20     public override string Swimming()
21     {
22         return "蛙泳";
23     }
24 }

上面的例子中,不同的派生類(雞、狗、蛙)對基類(動物)的游泳方法表現出各自不同的結果,即類的多態特性。

 

  也可以使用另一種方式遮擋來實現類的多態特性,即派生類使用new關鍵字來實現與基類同名方法的不同行為。

 1 public class Animal
 2 {
 3     public string Swimming()
 4     {
 5         return "不會";
 6     }
 7 }
 8 public class Dog : Animal
 9 {
10     //使用new關鍵字遮擋基類的同名方法,也可以使用到派生類的其他成員中
11     public new string Swimming()
12     {
13         return "狗刨";
14     }
15 }
16 public class Frog : Animal
17 {
18     //使用new關鍵字遮擋基類的同名方法,也可以使用到派生類的其他成員中
19     public new string Swimming()
20     {
21         return "蛙泳";
22     }
23 }

註:主要使用的情況是當我們沒有修改基類的許可權又希望實現派生類的多態特性時。

 

二、C#關鍵字:base

  在派生類的方法中使用“base.基類方法名”可以復用基類的方法。

 

三、C#關鍵字:sealed

  由於被override修飾的方法是隱式可重寫的,所以當我們不希望被override修飾的方法被重寫時,可以使用sealed關鍵字防止被重寫。

1 public class Dog : Animal
2 {
3     //Dog類不希望自己的游泳方法被它的派生類重寫
4     public sealed override string Swimming()
5     {
6         return "狗刨";
7     }
8 }

註:在防止被重寫中,sealed關鍵字必須與override關鍵字相同存在。

 

四、抽象類和抽象方法

  當一個基類的作用只是為派生類提供公共成員,而無其他實際意義時,我們不希望用戶通過new關鍵字創建這個基類,可將基類設計成抽象類,這樣用戶就不能用new關鍵字創建它。使用abstract關鍵字修飾類可使其變成抽象類。

  當抽象類的某個方法在派生類中表現出多態性時,這個方法的實現對派生來說是無用的,我們希望所有派生類必須重寫基類的這個方法,可將這個方法設計成抽象方法,這樣抽象類的抽象方法不用提供預設實現並且派生類必須使用override重寫此抽象方法。如果派生類不重寫這個抽象方法自身也將成為一個抽象類。使用abstract關鍵字修飾方法可使其變成抽象方法。

 1 /// <summary>
 2 /// 可調度溫度的電子設備
 3 /// </summary>
 4 public abstract class TemperatureElectric
 5 {
 6     protected int temperature;
 7 
 8     public abstract int Up();
 9 
10     public abstract int Down();
11 }
12 /// <summary>
13 /// 空調
14 /// </summary>
15 public class AirConditioner : TemperatureElectric
16 {
17     public override int Up()
18     {
19         if (temperature < 30)
20             temperature += 1;
21         return temperature;
22     }
23 
24     public override int Down()
25     {
26         if (temperature > 16)
27             temperature -= 1;
28         return temperature;
29     }
30 }
31 /// <summary>
32 /// 冰箱
33 /// </summary>
34 public class Refrigerator : TemperatureElectric
35 {
36     /// <summary>
37     /// 提升冷藏溫度
38     /// </summary>
39     public override int Up()
40     {
41         if (temperature < 7)
42             temperature += 1;
43         return temperature;
44     }
45 
46     /// <summary>
47     /// 降低冷藏溫度
48     /// </summary>
49     public override int Down()
50     {
51         if (temperature > 3)
52             temperature -= 1;
53         return temperature;
54     }
55 }

 

五、幾種概念的對比

1、重載與重寫

重載和重寫的相同點在於他們都是對同名的方法使用。

重載和重寫的不同點:在使用範圍上,前者使用在單個類中,後者使用在兩個或多個有繼承關係的類中;在使用意圖上,前者是寫法上的簡化,後者是功能上的擴展。

2、重寫與遮擋

重寫與遮擋的相同點在於他們都是對基類同名方法的擴展。

重寫與遮擋的不同點在於,通過A a = new B();B繼承於A,前者調用B的同名方法,而後者調用的是A的同名方法;前者用於主動設計,後者用於被動修改。

 1 public class RealizeObject
 2 {
 3     public void Realize()
 4     {
 5         //Dog是通過virtual重寫的Animal
 6         Animal animal = new Dog();
 7         animal.Swimming();//輸出的狗刨
 8 
 9         //Dog是通過new遮擋的Animal
10         Animal animal = new Dog();
11         animal.Swimming();//輸出的不會
12     }
13 }

3、虛方法和抽象方法

虛方法與抽象方法的相同點在於他們都可以被重寫。

虛方法與抽象方法的不同點:在使用範圍上前者大於後者,前者使用在非密封類中,後者只能使用在抽象類中;在使用方式上,前者必須有實現部分,後者不能有實現部分;在派生類中,前者可重寫可不重寫,後者必須重寫。

4、抽象類與介面類型的區別(見C#介面類型)

 


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

-Advertisement-
Play Games
更多相關文章
  • 對於想學習和實踐zabbix的讀者來說,在真實環境搭建一套zabbix系統是件費時費力的事情,本文內容就是用docker來縮減搭建時間,目標是讓讀者們儘快投入zabbix系統的體驗和實踐; 環境信息 以下是本次操作的環境: 1. 操作系統:MacBook Pro 2. Docker:19.03.2 ...
  • 筆記: 安裝docker的命令 curl -sSL https://get.docker.com/ | sh service docker start 排查錯誤的命令 strace 視頻地址在此:https://www.bilibili.com/video/av68889436/ ...
  • Jupyter Notebook 現已成為數據分析,機器學習的必備工具。因為它可以讓數據分析師集中精力向用戶解釋整個分析過程。通過安裝一些擴展工具,可以讓你在Jupyter Notebook上的工作效率進一步的提高。 Jupyter NbExtensions Configurator Jupyter ...
  • 安裝ptyhon3.7 sudo apt-get update sudo apt-get install python3.7 安裝成後的目錄在/usr/bin/python3.7,同時將其設置成預設 sudo update-alternatives --install /usr/bin/python ...
  • DRF框架中鏈表數據通過ModelSerializer深度查詢方法彙總 一.準備測試和理解準備 創建類 生成表單數據 Test1 id| test_2_id_id | 1|1 2|2 Test2 id|name | 1|名字1 2|名字2 二.深度查詢通過Test1獲得Test2的name而不是id ...
  • 需求:隨機生成驗證碼, 思路: 1.生成一個隨機數,65-90 2.數字轉化為字母:chr(數字) 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import random 5 temp = "" 6 for i in range(6): ...
  • [TOC] 一:序列     在數學上,序列是被排成一排的對象,而在python中,序列是最基本的數據結構。它的主要特征為擁有索引,每個索引的元素是可迭代對象。都可以進行索引,切片,加,乘,檢查成員等操作。在python中,有六種內建的索引,但是常用的是列表,元組,字元 ...
  • 這是大佬老A寫的一篇介紹Asp.Net core框架的文章https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 2001年,微軟推出了Asp.Net ,2009年,推出了Asp.Net MVC .Net Framewo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...