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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...