C#-11 介面

来源:https://www.cnblogs.com/wwwen/archive/2022/04/28/16191838.html
-Advertisement-
Play Games

一 什麼是介面 介面是指定一組函數成員而不實現它們的引用類型。 class Program { static void FlyFunc(IFly obj) { obj.Fly(); } static void Main(string[] args) { var bird = new Bird(); ...


一 什麼是介面

介面是指定一組函數成員而不實現它們的引用類型。

class Program
{
    static void FlyFunc(IFly obj) 
    {
        obj.Fly();
    }

    static void Main(string[] args)
    {
        var bird = new Bird();
        var butterfly = new Butterfly();
        FlyFunc(bird);
        FlyFunc(butterfly);
        Console.Read();
    }
}

//聲明一個IFly介面
interface IFly
{
    void Fly();
}

class Bird : IFly
{
    public void Fly()
    {
        Console.WriteLine("Bird Fly");
    }
}

class Butterfly : IFly
{
    public void Fly()
    {
        Console.WriteLine("Butterfly Fly");
    }
}

二 使用IComparable介面的示例

Array類有一個靜態方法Sort(),可以排序元素。

var array = new int[] { 50, 15, 59, 88, 14 };
Array.Sort(array);
foreach (var item in array)
    Console.Write($"{item} ");

//輸出 14 15 50 59 88

Array類的Sort方法倚賴於IComparable介面,它聲明在BCL中,包含唯一的方法CompareTo。

.NET文檔中描述了CompareTo方法的作用,在調用CompareTo方法時,它應該返回以下幾個值:

  • 負數值:當前對象小於參數對象;
  • 正數值:當前對象大於參數對象;
  • 零:兩個對象在比較時相等;

Sort使用的演算法倚賴於元素的CompareTo方法來決定兩個元素的次序。

class Program
{
    static void Main(string[] args)
    {
        var myInt = new int[] { 10, 20, 1, 5, 50 };
        var mcArr = new MyClass[5];
        for (int i = 0; i < 5; i++)
        {
            mcArr[i] = new MyClass() { TheValue = myInt[i] };
        }
        foreach (var item in mcArr)
        {
            Console.Write($"{item.TheValue} ");
        }
        Console.WriteLine();
        Array.Sort(mcArr);  //排序
        foreach (var item in mcArr)
        {
            Console.Write($"{item.TheValue} ");
        }
        Console.ReadLine();
        //輸出: 10 20 1 5 50
                1 5 10 20 50
    }
}

//自定義的MyClass類,實現IComparable介面
class MyClass : IComparable
{
    public int TheValue { get; set; }

    public int CompareTo(object obj)
    {
        var mc = (MyClass)obj;
        if (this.TheValue < mc.TheValue) return -1;
        if (this.TheValue > mc.TheValue) return 1;
        return 0;
    }
}

 三 聲明介面

介面聲明不能包含數據成員和靜態成員。

介面聲明只能包含以下類型的非靜態成員函數的聲明:

  • 方法
  • 屬性
  • 事件
  • 索引器

這些函數成員的聲明不能包含任何實現代碼,而在每一個成員聲明的主體後必須使用分號。

按照慣例,介面名稱以大寫 I 開頭,比如 ISaveable。

與類和結構一樣,介面聲明還可以分隔成分部介面聲明。

介面聲明可以有任何的訪問修飾符,public、protected、internal、private。

介面的成員是隱式public的,不允許有任何修飾符,包括public。

四 實現介面

只有類和結構才能實現介面。

要實現介面,類和結構必須:

  • 在基類列表中包括介面名稱
  • 為每一個介面成員提供實現
//聲明介面
interface
IMyInterface { int ID { get; set; } void Method(string s); } //實現介面 class MyInterface : IMyInterface { public int ID { get; set; } public void Method(string s) { Console.WriteLine(s); } }

類和結構可以實現任意數量的介面。

interface IDataRetrieve
{
    int GetData();
}

interface IDataStore
{
    void SetData(int x);
}

class MyData : IDataRetrieve, IDataStore
{
    int Mem1;
    public int GetData()
    {
        return Mem1;
    }

    public void SetData(int x)
    {
        Mem1 = x;
    }
}

static void Main(string[] args)
{
    var myData = new MyData();
    myData.SetData(5);
    Console.WriteLine($"data is : {myData.GetData()}");
}

五 實現具有重覆成員的介面

由於類可以實現任意數量的介面,有可能兩個或多個介面成員都有相同的簽名和返回類型。

這種情況下,類可以實現單個成員滿足所有包含重覆成員的介面。

interface IIfc1 
{
    void PrintOut(string s);
}

interface IIfc2
{
    void PrintOut(string s);
}

class MyClass : IIfc1, IIfc2    //實現兩個介面
{
    void PrintOut(string s)  //兩個介面的單一實現
    {
        Console.WriteLine(s);
    }
}

六 顯示介面成員實現

如果希望為每一個介面分離實現,可以通過創建顯示介面成員實現。

class MyClass : IIfc1, IIfc2    //實現兩個介面
{
    void IIfc1.PrintOut(string s)  //顯示實現IIfc1
    {
        Console.WriteLine($"IIfc1 : {s}");
    }

    void IIfc2.PrintOut(string s)  //顯示實現IIfc2
    {
        Console.WriteLine($"IIfc2 : {s}");
    }
}

七 派生成員作為實現

實現介面的類可以從它的基類繼承實現的代碼

interface IIfc1 
{
    void PrintOut(string s);
}

interface IIfc2
{
    void PrintOut(string s);
}

class MyClass : IIfc1, IIfc2    //實現兩個介面
{
    void IIfc1.PrintOut(string s)  //顯示實現IIfc1
    {
        Console.WriteLine($"IIfc1 : {s}");
    }

    void IIfc2.PrintOut(string s)  //顯示實現IIfc2
    {
        Console.WriteLine($"IIfc2 : {s}");
    }
}

class MyDerivedClass : MyClass 
{
}

static void Main(string[] args)
{
    var myDericed = new MyDerivedClass();
    ((IIfc1)myDericed).PrintOut("111");
    ((IIfc2)myDericed).PrintOut("222");
    Console.Read();
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 背景介紹 R和Python作為兩個開源、且容易上手的數據分析和繪圖工具,在科研中應用的比較廣泛。 在接下來的日子,我們圍繞Python進行繪圖和數據分析話題,寫一系列推文,事實上是我自己的一些學習筆記分享出來,為了我 方便查閱,也方便大家翻閱。 軟體介紹 [軟體名稱]:Anaconda | Spyd ...
  • 我們知道,頻繁操作資料庫會降低伺服器的系統性能,因此通常需要將頻繁訪問、更新的數據存入到緩存。Halo 項目也引入了緩存機制,且設置了多種實現方式,如自定義緩存、Redis、LevelDB 等,下麵我們分析一下緩存機制的實現過程。 ...
  • 適用 2022.1 【更新時間 2022-4-29】 引言 由於IDEA在2021.2.2以後我們不能再使用重置大法白嫖了。 為了打擊破解,Jetbrains煞費苦心,這次採用了JB賬號登陸,通過授權認證獲取免費試用資格(所以之前的無限重置的插件在今後的新版本中,將無法使用),以下整理了一個免JB註 ...
  • 前幾篇都是手動錄入或隨機函數產生的數據。實際有許多類型的文件,以及許多方法,用它們從文件中提取數據來圖形化。 比如之前python基礎(12)介紹打開文件的方式,可直接讀取文件中的數據,擴大了我們的數據來源。下麵詳細介紹從文件中載入數據。 一、使用內置的 csv 模塊載入CSV文件 CSV文件是一種 ...
  • 我前面幾篇隨筆介紹了關於幾篇關於SqlSugar的基礎封裝,已經可以直接應用在Winform項目開發上,並且基礎介面也通過了單元測試,同時測試通過了一些Winform功能頁面;本篇隨筆繼續深化應用開發,著手在在.net6框架的Web API上開發應用,也就是基於.net core的Web API應用... ...
  • 前言 一個項目上線了兩個月,除了一些反饋的優化和小Bug之外,項目一切順利;前期是屬於推廣階段,可能使用人員沒那麼多,當然對於項目部署肯定提前想到併發量了,所以早就把集群安排上,而且還在測試環境搞了一下壓測,絕對是沒得問題的;但是,就在兩個月後的一天,系統突然跑的比烏龜還慢,投訴開始就陸續反饋過來了 ...
  • 本文以C#及vb.net代碼為例介紹如何來實現合併PDF頁面內容。本文中的合併並非將兩個文檔簡單合併為一個文檔,而是將多個頁面內容合併到一個頁面,目的是減少頁面上的空白區域,使頁面佈局更為緊湊、合理。下麵,將分別從兩個示例來展示合併,即: 從兩個PDF文檔頁面實現頁面合併 在同一個PDF文檔實現頁面 ...
  • 由於我們有時候需要在基於.net framework的項目上使用(如Winform端應用),有時候有需要在.net core的項目上使用(如.net core的WebAPI),那麼我們把基於SQLSugar的基礎模塊封裝,編譯為.net standard就很有必要,而且由於.net framewor... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...