.NET Core CSharp初級篇 1-6 類的多態與繼承

来源:https://www.cnblogs.com/WarrenRyan/archive/2019/07/24/11241566.html
-Advertisement-
Play Games

.NET Core CSharp 初級篇 1 6 本節內容為類的多態與繼承 簡介 終於講到了面向對象三大特性中的兩大特性——繼承與多態。通過繼承與多態,我們能很好的將類的拓展性發揮到了極致。在下麵的內容講解中,我們將從各個方面對繼承和多態進行刨析。 繼承 繼承事實上是一個非常好理解的語法,在C 中實 ...


.NET Core CSharp初級篇 1-6

本節內容為類的多態與繼承

簡介

終於講到了面向對象三大特性中的兩大特性——繼承與多態。通過繼承與多態,我們能很好的將類的拓展性發揮到了極致。在下麵的內容講解中,我們將從各個方面對繼承和多態進行刨析。

繼承

繼承事實上是一個非常好理解的語法,在C#中實現繼承使用A:B,表示A類繼承B類。子類(一稱為派生類)繼承於父類(一稱為基類)就好比孩子繼承了父親的一切,但是孩子總歸是有自己的個性的,而父親也有一些不會告訴孩子的事情。如果我們從之前的訪問控制符這一部分進行理解的話,你可以這樣描述這個“融洽”的父子關係。

假定有以下這個例子:塞巴斯蒂安·艾奎斯(父類)是一個歐洲宮廷的貴族,67歲,他是一個子爵,並且掌握了一個驚天大秘密不能告訴任何人,只能爛在肚子里。他育有一子名叫麥克·艾奎斯,由於塞巴斯蒂安·艾奎斯年老體弱,當家裡需要錢的時候,他會讓自己的兒子帶上銀行卡前往atm機取錢。兒子的車和他的車一模一樣,每次兒子讓管家開車的時候都必須說清楚:“我要開我父親的車。”,或者:“今天我開我自己的車”。如果他沒有說,那麼管家會預設的取出兒子的車。他家還有一個大莊園閑置可以用於開發,只要父親同意,那麼兒子可以自由開發。

對於這個例子,你需要得出的結論是:

  • 如果塞巴斯蒂安·艾奎斯(父類)沒有出生,那麼麥克·艾奎斯(子類)也不存在。(子類實例化時必定先調用父類構造方法)
  • 對於塞巴斯蒂安·艾奎斯(父類),他的名字屬於大家都可以知道的(public),誰都可以輕易的得到。但是想擁有這個名字,卻只能是他的家族的人才可以(繼承後才能獲得父類的欄位)。
  • 對於前往ATM機取錢這件事,取款密碼只可能告訴他的兒子,別人是不能得到的。(protected可以被子類訪問,但是其餘不可訪問)
  • 塞巴斯蒂安·艾奎斯(父類)知道一個秘密,這個秘密只有他本人才知道(private),包括他的兒子也不可能知曉(子類無法獲取private)
  • 因為父子倆的車一模一樣,取車需要特別說明(子類和父類函數簽名一致時,父類函數預設會隱藏,除非顯式的說明)
  • 大莊園是父親的,但是可以被兒子取改造(父類函數指定為virtual時,子類可以重寫父類函數)

通過這一些刨析,我認為你應該已經清楚了七八分繼承的意思了。這裡需要介紹一下我們的base關鍵字,base關鍵字在子類中體現為調用父類的方法。

特別的,你需要註意的是,C#對於類與類的繼承只支持單繼承,如果你試圖實現多繼承,你可以使用介面作為媒介和橋梁。

我們現在用一段代碼演示完我們的繼承,我們這個教程更多的是引導你去思考,而不是讓你如同一些速成培訓班出來的一樣,沒有獨立的思考能力。

class Father
{
    public Father()
    {
        Console.WriteLine("Father Method");
    }
    private string MSGSecret;
    protected string BankSecret;
    public string Name;
    public string Car;
    protected void test()
    {

    }
}
class Son:Father
{
    public Son()
    {
        Console.WriteLine("Son Method");
    }
    //隱式的生成了這三個欄位
    //protected string BankSecret;
    //public string Name;
    //public string Car;
    public string Car;
    public void getCar()
    {
        base.Car;//父類
        this.Car;//子類
        base.test()//調用父類方法,如果簽名不衝突,可以省略base
    }
}
Son s = new Son();//思考一下這裡會輸出什麼?

多態

多態是一個並不困難的東西,在繼承和介面中我們講到的重寫其實就是多態性的一種類型了。之前我們簡單的舉過一個例子來說明多態:人和鯉魚都是動物,但是人用肺進行呼吸,而鯉魚用鰓進行呼吸。這個例子就很好的體現了多態。利用下麵這段代碼來解釋吧。

class Animal
{
    //通過抽象方法實現多態
    abstract void Breathing();
    //虛方法實現多態
    virtual void Eat()
    {
    }
}
class Human:Animal
{
    override void Breathing()
    {

    }
    override void Eat()
    {

    }
}
class Fish:Animal
{
    override void Breathing()
    {
        
    }
    new void Eat()
    {

    }
}
Animal ah = new Human();
Animal af = new Fish();
Fish f = new Fish();

註意看最後幾行,ah和af各屬於Human和Fish的對象,但是當方法調用的時候,統一調用父類中的方法,並且載入子類中的重寫和實現。

ah.Eat();//調用父類的Eat(),但是以Human類中的重寫方法為實現
af.Eat();
f.Eat();

這三者的區別在哪裡?事實上你只需要知道,多態性就是通過父類去管理子類,讓子類遵循父類的規範。當子類使用從父類繼承的方法的時候,是去調用父類的方法,但是使用子類的實現。特別的,如果你在方法中使用new修飾符,那麼這個方法將會和父類毫無關係,就如這個單詞的意思一樣,這是一個新的函數,不是父類中的函數。現在你可以試著分析上述三個函數調用的各是哪個類中的方法。

多態最大的有點就是你可以通過一個基類或者介面去管理所有繼承於他們的子類的函數方法,並且同一個函數可以有多種實現方法。

如果你使用介面和抽象類去實現多態,實現的方法也是一樣的,只不過是基類型無法實例化。

Github

BiliBili主頁

WarrenRyan's Blog

博客園


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

-Advertisement-
Play Games
更多相關文章
  • 如何優雅關閉 Spring Boot 應用 如何優雅關閉 Spring Boot 應用前言定製 Tomcat Connector 行為內嵌 Tomcat 添加 Connector 回調開啟 Shutdown Endpoint模擬測試實現自動化總結參考 如何優雅關閉 Spring Boot 應用前言定 ...
  • 在我們的日常生活和工作中,難免會碰到要給別人傳文件的時候。可能這對現在的你來說不是一件很難的事情,估計相當多的一部分人說我可以直接把文件拖進微信或者 qq 里發給別人,但這個只適用於文件較少的時候,文件較多的時候用聊天工具來進行文件傳輸就又變成了一件很麻煩的事情。 這時候你可能又會說,那我可以傳到某 ...
  • T1 奶牛曬衣服 題目 【題目描述】 在熊大媽英明的帶領下,時針和他的同伴生下了許多牛寶寶。熊大媽決定給每個寶寶都穿上可愛的嬰兒裝。於是,為牛寶寶洗曬衣服就成了很不爽的事情。 聖人王擔負起了這個重任。洗完衣服後,你就要弄乾衣服。衣服在自然條件下用1的時間可以曬乾A點濕度。摳門的熊大媽買了1台烘衣機。 ...
  • pymysql是Python操作mysql的最主要方法,本文詳細介紹pymysql的建庫、建表和增刪改查操作。 ...
  • 在做SSM項目時發現一個有趣的bug,在這裡記錄一下。 資料庫表如下: 實體類:grade欄位初始設定為int類型 在用mybatis對第三條數據進行修改時,希望賦值的更改,未賦值的不更改,測試運行 修改後發現資料庫中的grade欄位變成了0,這不是我想要的,(按照正常需求應該是原來的數字5) 查看 ...
  • 前面提過,AWT沒提供能夠直接顯示圖像的控制項,這無疑是個令人詬病的短板,因為一上來就得由程式員自己去定義新控制項,對於初學者來講很不友好。這個問題在Swing中也解決掉了,不過Swing並未提供單獨的圖像視圖,而是利用標簽控制項JLabel來顯示圖像。JLabel的setText方法用來設置標簽上的文本 ...
  • 9.94 守護線程與守護進程的區別 9.95 線程互斥鎖 9.96 死鎖現象與遞歸鎖 mutexA=mutexB=RLock() 一個線程拿到鎖,counter加1,該線程內又碰到加鎖的情況,則counter繼續加1,這期間所有其他線程都只能等待,等待該線程釋放所有鎖,即counter遞減到0為止 ...
  • LeetCode:135. 分發糖果 老師想給孩子們分發糖果,有 N 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。 你需要按照以下要求,幫助老師給這些孩子分發糖果: 每個孩子至少分配到 1 個糖果。 相鄰的孩子中,評分高的孩子必須獲得更多的糖果。 那麼這樣下來,老師至少需要準備多 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...