.NET Core CSharp初級篇 1-5 介面、枚舉、抽象

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

.NET Core CSharp 初級篇 1 5 本節內容類的介面、枚舉、抽象 簡介 問題 如果你需要表示星期或者是某些狀態,使用字元串或者數字是否不直觀? 你是否發現,無論何種電腦,它的USB口的設計都是遵循一定規範的? 枚舉 枚舉(enum)是一個非常好用的一個特殊值類型,他可以讓你指定一系列字 ...


.NET Core CSharp初級篇 1-5

本節內容類的介面、枚舉、抽象

簡介

問題

  • 如果你需要表示星期或者是某些狀態,使用字元串或者數字是否不直觀?
  • 你是否發現,無論何種電腦,它的USB口的設計都是遵循一定規範的?

    枚舉

    枚舉(enum)是一個非常好用的一個特殊值類型,他可以讓你指定一系列字元常量(通常從0開始)。它的定義和使用如下:
public enum Week
{
    Monday,
    ...//此處省略
    Sunday = 6//可賦值
}
bool flag = (6 == (int)Week.Sunday)

不過你也可以指定其他的類型作為枚舉的值,例如:

public enum Week:byte
{
    Monday,
    ...
    Sunday= 6
}

枚舉與其他類型的轉換使用強制類型轉換即可,例如:(int)Week.Sunday,不過特別的,0不需要強制轉換就可以和枚舉進行比較。

Flag Enum

這是一個有趣的枚舉,它支持你對枚舉按位進行運算,使用flag enum需要在枚舉名上面指定一個Attribute,也就是[Flags],通常來說,我們會使用2的冪作為枚舉值,因為按位運算本質是2進位的運算。

具體實例如下

[Flags]
public enum Status
{
    Success = 1,
    NotFound = 2,
    Fail = 4
}
//支持按位運算,運算步驟我們在之前已經有過詳細的講解
Status.Success | Status.NotFound

預設的,如果你輸入了一個不合理的枚舉值(也就是沒定義),編譯器會預設直接輸出該數字,不過如果你使用了按位運算的枚舉,那麼他會將你輸入的數字轉換成二進位與每一個枚舉值進行&運算,得出的結果會與枚舉值進行比較,如果找到了就會輸出。

例如以上例的Status:

Console.WriteLine((Status)7);
//輸出是三個都輸出
//7 = 0111,
//1 = 0001,
//2 = 0010
//4 = 0011

介面

介面這個東西,新手非常容易被誤導,例如在WebApi開發中,你的前端朋友讓你把介面給他,這個時候,他需要的東西在後端的口中叫做API,
當你的後端朋友說,你寫一個介面,我們使用依賴註入進行統一管理實現了介面的類,這個時候,他需要的是一個約定,也是我們這裡講的介面(interface)。

介面是C#面向對象中實現多態的重要語法。介面的定義可以理解為是一種約定的規範。例如電腦的USB-A介面,全世界的廠商都是統一規範生產,如果大家不按著約定生產,後果會是什麼?

在C#中,介面也一樣起到了這個作用,但是還有一些更為廣泛的應用。

介面的定義使用interface關鍵字,預設的,所有介面的成員的訪問許可權都是public,因為規範是需要公佈給所有人看,如果定義了訪問許可權就沒有實際的意義了
,並且介面中所有的函數都不存在函數體。總的來說就是,介面是一個提供類的規格的東西,卻不提供實現。

介面的例子

//定義一個介面
public inteface IHuman
{
    void Eat();
    bool Alive();
}
//介面的實現,必須實現每一個介面中的函數並保持返回類型、函數簽名,函數參數一致
public class Human:IHuman
{
    void Eat()
    {

    }
    bool Alive()
    {
        return default<bool>();
    }
}

介面的實現會和我們後面講到的繼承非常相似,在這裡,你只需要記住介面支持一個類實現多個介面,但只能繼承一個類即可。

介面衝突

因為支持一個類實現多個介面,那麼很有可能會造成A介面中擁有和B介面中完全一致的函數,這個時候我們就需要使用顯式實現介面進行處理。

當你需要調用不同介面的同簽名方法時,使用介面進行強制轉換即可。

例如:

interface IApple
{
    void Wash();
}
interface IFruit
{
    void Wash();
}
class test : IApple,IFruit
{
    void IApple.Wash()=>{};
    void IFruit.Wash()=>{};
}
test t= new test();
((IApple)t).Wash();
((IFruit)t).Wash();

這樣就可以避免介面在命名上的衝突。

並且介面如果你隱式的實現,所有介面函數預設都是sealed的。
如果存在一個多繼承的問題,這個可能目前講起來為之過早,我就順口提一下,例如,人類繼承與動物類,動物繼承於生物介面,
那麼對於人類,是隱式的繼承了生物介面,但是對於人類和動物,進食的方式有很大區別,那麼我們就應該重寫進食這個方法。
我們就要把基類(父類)中的介面函數標記為virtual或者abstract,然後在子類中使用override進行重寫。

這就已經說的太遠了,後面我們會進行深入的刨析。

抽象

抽象可以有抽象欄位、抽象類、抽象委托、抽象函數等等。我們就以其中常用的抽象函數和抽象類做一個解析。

抽象和介面非常相似,抽象類不能被實例化,抽象方法沒有方法體,都是依賴子類(被繼承類)進行操作。

抽象函數

這個就和介面幾乎一模一樣,也沒有太多講的必要,如果你聲明瞭一個函數是抽象函數,那麼它不存在方法體,你需要通過子類去重寫(override)實現。

在實際應用中,子類僅能重寫父類中的虛方法或者抽象方法,當不需要使用父類中方法的內容時,將其定義成抽象方法,否則將方法定義成虛方法。

抽象類

"一個包含一個或多個純虛函數的類叫抽象類,抽象類不能被實例化,進一步
一個抽象類只能通過介面和作為其它類的基類使用."

一個抽象類可以包含抽象和非抽象方法,當一個類繼承於抽象類,那麼這個派生類必須實現所有的
的基類抽象方法。

但是通過聲明派生類也為抽象,我們可以避免所有或特定的虛方法的實現,
這就是抽象類的部分實現。

看起來很高深?事實上抽象類就是一個提供了有部分沒有方法體的函數和有具體實現的函數的集合。它相比於介面毫無實現而言,抽象類可以提供非抽象的方法,也就是說,抽象類中可以含有有實現方法的函數。

看這個例子

public abstract class A
{
    public void GetSomeThing()
    {
        //todo
    }
    public abstract void SetSomeThing();
}
public class B:A
{
    //實現抽象方法
    public override void SetSomeThing()
    {
        //調用非抽象方法
        base.GetSomeThing();
    }

}

這裡面涉及到了base關鍵字以及":"繼承符號,在後面的繼承、多態的課程有會有更加深入的介紹。

Github

BiliBili主頁

WarrenRyan's Blog

博客園


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

-Advertisement-
Play Games
更多相關文章
  • 運用input函數搜集信息 input()函數結果的賦值name = input('請輸入你的名字:') #將input()函數的執行結果(收集的信息)賦值給變數name input()函數的使用場景1.函數結果賦值 name=input()2.搜集信息 name=input(xxx)3.輸出結果 ...
  • Goroutine 和 Channel 是 Go 語言併發編程的兩大基石,本文深度解密 channel 的底層原理。 ...
  • Java 8曾經與Docker無法很好地相容性,現在問題已消失。 請註意:我在本文中使用採用GNU GPL v2許可證的OpenJDK官方docker映像。在Oracle Java SE中,這裡描述的docker支持功能在更新191中引入。Oracle在2019年4月更改了Java 8更新的許可證, ...
  • 老套路,先列舉下關於ThreadLocal常見的疑問,希望可以通過這篇學習筆記來解決這幾個問題: 1. ThreadLocal是用來解決什麼問題的? 2. 如何使用ThreadLocal? 3. ThreadLocal的實現原理是什麼? 4. 可否舉幾個實際項目中使用ThreadLocal的案例? ...
  • 垃圾回收是 Python 自帶的機制,用於自動釋放不會再用到的記憶體空間; 什麼是記憶體泄漏呢? 記憶體泄漏,並不是說你的記憶體出現了信息安全問題,被惡意程式利用了,而是指程式本身沒有設計好,導致程式未能釋放已不再使用的記憶體。 記憶體泄漏也不是指你的記憶體在物理上消失了,而是意味著代碼在分配了某段記憶體後,因為設 ...
  • int, float, string整數,浮點數,字元串 字元串(string)用引號括起來的文本 >>> Chinese = '鏡像世界'>>> English = "mirror world">>> number = "666">>> symbol = '''科A!@'''>>> mixture ...
  • 1. 將Message.java拷貝到 /Users/sunny/test目錄下(和NVIDIAClassLoader類MESSAGE_CLASS_PATH指定的路徑一致),並編譯生成位元組碼文件(.class)。 2.編寫自定義ClassLoader類。 3.測試類。 運行結果: ...
  • ORM框架(持久化流程) session是事務 (transaction) 的工廠,處理session後,所有更改將自動刷新到資料庫中。或者,如果要處理何時將更改刷新到資料庫,即transaction將在session處理完後非同步提交。session也可以取消事務。 新建兩個項目,Data 與 Da ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...