這次是C#中的介面

来源:http://www.cnblogs.com/Helius/archive/2016/04/02/5348088.html
-Advertisement-
Play Games

介面的出現,是為瞭解決C#中不允許多重繼承的問題。 1、什麼是介面? 我覺得可以把介面理解為對一組方法聲明進行的統一命名,但這些方法沒有提供任何實現。 通過介面,就可以對方法進行統一管理,避免了在每種類型中重覆定義這些方法。 2、如何使用介面來編程 2.1 介面的定義 interface ICust ...


 介面的出現,是為瞭解決C#中不允許多重繼承的問題。

1、什麼是介面?

我覺得可以把介面理解為對一組方法聲明進行的統一命名,但這些方法沒有提供任何實現。

通過介面,就可以對方法進行統一管理,避免了在每種類型中重覆定義這些方法。

 

2、如何使用介面來編程

2.1 介面的定義

interface ICustomCompare

{

  //定義比較方法,繼承該介面的類都要實現該方法

  int CompareTo(object other);

}

在介面中定義方法不能添加任何訪問修飾符,因為介面中的方法預設是public,如果顯示地指定了修飾符,則會出現編譯時錯誤。也不能使用static關鍵字進行修飾。

在介面中除了可以定義方法外,還可以包含屬性、事件、索引器,或者這4類成員(包括方法)類型的任意組合;但介面類型不能包含欄位、運算符重載、實例構造函數和析構函數。

 

2.2 繼承介面

public class Person:ICustomCompare

{

  int age;

  public int Age{get{return age;} set{age=value;}}

  //實現介面方法

  public int CompareTo(object value)

  {

    if(value==null)

    {

      return 1;  

    }

    //將Object類型強制轉換為Person類型

    Person otherp=(Person)value;

    //把當前對象的Age屬性與需要比較的對象的Age屬性進行對比

    if(this.Age<otherp.Age)

    {

      return -1;

    }  

    if(this.Age>otherp.Age)

    {

      return 1;

    }

    return 0;  

  }

}

在上面的的Person類中,實現了ICustomCompare介面中的CompareTo方法。

CompareTo方法會首先判斷參數對象是否為null,如果為null,則直接返回1,代表當前對象比傳入對象大。

如果對象不為空的話,強制轉換成Person類型,對Age屬性進行對比,當前對象的Age屬性值比傳入對象的Age屬性值大,則返回1,如果返回-1,則說明當前對象的Age屬性比傳入的對象小。

 

2.3 調用介面中的方法

class Program

{

  static void Main(string[] args)

  {

    Person p1=new Person();

    p1.Age=18;

    Person p2=new Person();

    p2.Age=19;

    //調用介面中方法,對p1和p2進行比較

    if(p1.CompareTo(p2)>0)

    {

      Console.WriteLine("p1比p2大");

    }

    else if(p1.CompareTo(p2)<0)

    {

      Console.WriteLine("p1比p2小");

    }

    else

    {

      Console.WriteLine("p1比p2一樣大");

    }

    Console.ReadKey();

  }

}

 

3、顯示介面實現方法

在上面的示例代碼當中,使用了隱式的介面實現方式,即在實現代碼中沒有指定實現哪個介面中的CompareTo方法。

當然,也存在顯式的介面實現方式,在類實現介面的過程中,明確指出實現哪一個介面中的哪一個方法。

interface IChineseGreeting

{

  //方法聲明

  void SayHello();

}

interface IAmericanGreeting

{

  //方法聲明

  void SayHello();

}

//Speaker類實現了兩個介面

public class Speaker:IChineseGreeting,IAmericanGreeting

{

  //隱式介面實現

  public void SayHello()

  {

    Console.WriteLine("你好");

  }

}

上面的Speaker類實現了兩個介面,碰巧兩個介面中聲明的方法具有相同的返回類型、相同的方法名稱和相同的參數。若採用隱式的介面實現方式,下麵的代碼將調用相同的SayHello方法。

static void Main(string[] args)

{

  Speaker speaker=new Speaker();

  //調用中國人打招呼方法

  IChineseGreeting chinese=(IChineseGreeting)speaker;

  chinese.SayHello();

 

  //調用美國人招呼方法 

  IAmericanGreeting American=(IAmericanGreeting)speaker;

  American.SayHello();

}

當Main函數執行的時候,得到的介面是兩個 “你好”;

這並不是我們期望的結果,所以這種情況下,我們必須使用顯式的介面實現方式來解決這個命名衝突問題。

//Speaker類實現了兩個介面

public class Speaker:IChineseGreeting,IAmericanGreeting

{

  //顯式介面實現

  void IChineseGreeting.SayHello()

  {

    Console.WriteLine("你好");

  }

  

  //顯式介面實現

  void IAmericanGreeting.SayHello()

  {

    Console.WriteLine("Hello");

  }

}

使用這種方式就可以解決命名衝突問題。在使用顯示的介面山西ian方式時,需要註意一下幾個問題:

  • 若顯式實現介面,方法不能使用任何訪問修飾符,顯式實現的成員都預設為私有。
  • 顯式實現的成員預設是私有的,所以這些成員都不能通過類的對象進行訪問。正確的調用方法是把speaker對象顯式地轉換成對應的介面,通過介面來調用SayHello方法。

針對以上的兩種方式:顯式實現和隱式實現,下麵針對兩種實現的區別和使用場景進行總結:

  • 採用隱式介面實現時,類和介面都可以訪問介面中的方法;而若採用顯式介面實現方式,介面方法只能通過介面來完成訪問,因此此時介面方法預設為私有。
  • 當類實現單個介面時,通常使用隱式介面實現方式,這樣類的對象可以直接去訪問介面方法。
  • 當類實現了多個介面,並且介面中包含相同的方法名稱、參數和返回類型時,則應使用顯式介面實現方式。即使沒有相同的方法簽名,在實現多個介面時,扔推薦使用顯式的 方法,因為這樣可以標識出哪個方法屬於哪個介面。

 

4、介面與抽象類

這裡主要是闡述一下兩者的區別:

  • 抽象類使用abstract關鍵字進行定義,而介面使用interface進行定義;他們都不能進行實例化。
  • 抽象類中可以包含虛方法、非抽象方法和靜態成員;但介面中不能包含虛方法和任何靜態成員,並且介面中只能定義方法,不能有具體實現,方法的具體實現由實現類完成。
  • 抽象類不能實現多繼承,介面則支持多繼承。註意,從嚴格意義上說,類接觸介面應該成為類實現介面。
  • 抽象類是對一類對象的抽象,繼承於抽象類的類與抽象類為屬於的關係;而類實現介面只是代表實現類具有介面聲明的方法,是一種Can-DO的關係。所以一般介面後都帶有able欄位,表示“我能做”的意思。

上面的幾點只是介面與抽象類之間差異的主要方法,它們還有很多的不同,大家可以參考一下別的書籍或者別的博客。


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

-Advertisement-
Play Games
更多相關文章
  • 最近在看前輩們寫的代碼,他們把沒有用的代碼是註釋掉而不是刪掉。沒用的代碼和註釋很亂,看著心煩,就把註釋刪掉來解讀,頓時爽快多了。 不多說了,直接舉例子 比如一個文本文件 data 里的內弄為 cat a | awd ... #這是一個註釋 #[ $? -eq 0 ] || exit 1 [ $? - ...
  • 馬哥linux運維初級+中級+高級 視頻教程 教學視頻 全套下載(近50G)目錄詳情:18_02_ssl協議、openssl及創建私有CA18_03_OpenSSH服務及其相關應用09_01_磁碟及文件系統管理詳解之三10_05_腳本編程之八 腳本完成磁碟分區格式化20_01_DNS主從複製及區域傳 ...
  • Shell高級編程視頻教程-跟著老男孩一步步學習Shell高級編程實戰視頻教程 教程簡介: 本教程共71節,主要介紹了shell的相關知識教程,如shell編程需要的基礎知識儲備、shell腳本概念介紹及第一個腳本案例、shell腳本基礎知識-作用地位-比其他語言優勢、建立一個規範的shell腳本、 ...
  • 一.實驗要求: 給定任意一個字元N(N>0),然後列印NxN的倒序乘法表。 二.解決問題: #/!bin/bash# #define functionNxN_fun(){ local i=$1 #定義一個局部變數i控制外層迴圈 while [ $i -ge 1 ];do local j=$i #定義 ...
  • 微軟Build 2016開發者大會在美國舊金山的莫斯康展覽中心開幕。本次大會對一些重點功能進行了完善。如手寫筆支持技術Windows Ink、語音識別Cortana應用集(Cortana Collection)、生物識別技術Windows Hello支持Edge瀏覽器以及將通用應用平臺(UWP)擴大 ...
  • ubuntu中文版home文件夾里用目錄的“桌面”、“圖片”、“視頻”雖然對於中文使用者看起來舒適直觀,但是對於bash使用來說簡直是障礙。所以需求就來了,如何保留大部分的中文特性,而讓這些預設路徑成為英文版的呢?認真拷貝下列命令,並註意說明。如不成功,多試幾次! 打開終端,輸入命令: export... ...
  • 2016-03-31 張超《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 Linux如何創建一個新進程 1.我們先閱讀理解task_struct數據結構 1235struct task_struct { 1236 v ...
  • 來自系統媽:http://www.xitongma.com 深度技術GHOST win7系統32,64位經典優化版 V2016年3月 系統概述 深度技術ghost win7系統64位經典優化版適用於筆記本、品牌機,也支持組裝相容機,安裝後自動激活,可供品牌機專賣店及普通用戶安裝使用。保留了在區域網辦 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...