初識C#介面

来源:http://www.cnblogs.com/xiangyisheng/archive/2016/12/10/6156170.html
-Advertisement-
Play Games

C# 介面(Interface) 介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。 介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。 抽象類在 ...


C# 介面(Interface)

介面定義了所有類繼承介面時應遵循的語法合同。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。

介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的聲明。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。

抽象類在某種程度上與介面類似,但是,它們大多只是用在當只有少數方法由基類聲明由派生類實現時。

介面是引用類型的,類似於類,和抽象類的相似之處有三點:
       1、不能實例化;
       2、包含未實現的方法聲明;
       3、派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員(不僅是方法包括其他成員);

       另外,介面有如下特性:介面除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個介面,但只能直接繼承一個類(包括抽象類)。

C#介面的作用 

1.介面用於描述一組類的公共方法/公共屬性. 它不實現任何的方法或屬性,只是告訴繼承它的類《至少》要實現哪些功能,繼承它的類可以增加自己的方法.

2.使用介面可以使繼承它的類: 命名統一/規範,易於維護.比如: 兩個類 "狗"和"貓",如果它們都繼承了介面"動物",其中動物裡面有個方法Behavior(),那麼狗和貓必須得實現Behavior()方法,並且都命名為Behavior這樣就不會出現命名太雜亂的現象.如果命名不是Behavior(),介面會約束即不按介面約束命名編譯不會通過.

3.提供永遠的介面。 當類增加時,現有介面方法能夠滿足繼承類中的大多數方法,沒必要重新給新類設計一組方法,也節省了代碼,提高了開發效率

聲明介面

介面使用 interface 關鍵字聲明,它與類的聲明類似。介面聲明預設是 public 的。下麵是一個介面聲明的實例:

//公共介面: "動物" 
public interface IAnimal
 {
        void Behavior(); //行為方法,描述各種動物的特性 
}
 
//類: 狗 
public class Dog : IAnimal
{
        public void Behavior()
        {
               //Console.Write("我晚上睡覺,白天活動");
                MessageBox.Show("我晚上睡覺,白天活動");
         }
 }
 
//類: 貓 
public class Cat : IAnimal
{
      public void Behavior()
      {
                //Console.Write("我白天睡覺,晚上活動");
                MessageBox.Show("我白天睡覺,晚上活動");
       }
 }
//簡單的應用: 
public static Main() 
{ 
       Dog myDog = new Dog(); 
       myDog.Behavior(); //輸出: "我晚上睡覺,白天活動" 
       Cat myCat = new Cat(); 
       myCat.Behavior(); //輸出: "我白天睡覺,晚上活動" 
}

以上調用不同的類的相同名方法,會輸出不同的東東,也就是說每個類裡面的同名方法完成的功能可以是完全不同的.

更進一步,不是用上面Main方法這樣一個一個調用類的方法,用多態性實現其調用.

看一下下麵這個方法:

public void Behavior(IAnimal myIanimal)
{
            myIanimal.Behavior();
}

其參數是介面類型,任何繼承它的類都可以調用此方法,此方法能根據類的不同調用不同的類 中的方法. 也即能夠自己根據不同的類,完成不同的類的功能.

多態性代碼示例:

Dog myDog = new Dog();
Cat myCat = new Cat();
Behavior(myDog); //Behavior接受“狗”類實例 
Behavior(myCat); //Behavior接受“狗”類實例

這樣Behavior方法寫一次就能完成所有繼承它的類中的相同名方法的不同功能. 非常方便,同樣,由於“動物軟體”功能需求,需要再增加一個"龜"類:

//類: 龜 
public Tortoise: IAnimal 
{ 
       public void Behavior() 
       {
                  MessageBox.Show("我可以不活動,一睡就睡五千年!");
       } 
}

那麼也可以調用上面多態方法,所以說介面使方法具有較好擴展性. 如果繼承它的類很多的話,有多少好處是可想而知的!(出處:http://blog.csdn.net/yunhaic/article/details/6662843)

同樣,假設我們公司有兩種程式員:VB程式員,指的是用VB寫程式的程式員,用clsVBProgramer這個類表示;Delphi程式員指的是用Delphi寫程式的程式員,用clsDelphiProgramer這個類來表示。每個類都有一個WriteCode()方法。定義如下:

public class clsVBProgramer
{
    public void WriteCode()
    {
        //用VB語言寫代碼;
    }
}

public class clsDelphiProgramer
{
    public void WriteCode()
    {
        //用Delphi語言寫代碼;
    }
}

public class clsProject
{
    public void WritePrograme(clsVBProgramer programer)//用VB寫代碼
    {
        programer.WriteCode();
    }
    public void WritePrograme(clsDelphiProgramer programer)//重載方法,用Delphi寫代碼
    {
        programer.WriteCode();
    }
}

static void Main(string[] args)
{
    clsProject proj = new clsProject();
    //如果需要用VB寫代碼
    clsVBProgramer programer1 = new clsVBProgramer();
    proj.WritePrograme(programer1);
    //如果需要用Delphi寫代碼
    clsDelphiProgramer programer2 = new clsDelphiProgramer();
    proj.WritePrograme(programer2);
}

但是如果這時公司又來了一個C#程式員,我們怎麼改這段程式,使它能夠實現用C#寫程式的功能呢?我們需要增加一個新類clsCSharpProgramer,同時在此clsProject這個類中要再次重載WritePrograme(clsCSharpProgramer programer)方法。這下麻煩多了。如果還有C程式員,C++程式員,JAVA程式員呢。麻煩大了!

但是如果改用介面,就完全不一樣了:
首先聲明一個程式員介面:

    class Program
    {
        static void Main(string[] args)
        {
            clsProject proj = new clsProject();
            IProgramer programer;
            //如果需要用VB寫代碼
            programer = new clsVBProgramer();
            proj.WritePrograme(programer);
            //如果需要用Delphi寫代碼
            programer = new clsDelphiProgramer();
            proj.WritePrograme(programer);

        }
    }
    /// <summary>
    /// 聲明介面
    /// </summary>
    public interface IProgramer
    {
        void WriteCode();
    }
    //然後聲明類,並實現IProgramer介面:
    /// <summary>
    /// VB程式員實現的WriteCode方法
    /// </summary>
    public class clsVBProgramer : IProgramer
    {
        public void WriteCode()
        {
            //用VB語言寫代碼;
            Console.WriteLine("我是VB程式員實現的");
        }
    }
    /// <summary>
    /// Delphi程式員實現的WriteCode方法
    /// </summary>
    public class clsDelphiProgramer : IProgramer
    {
        public void WriteCode()
        {
            //用Delphi語言寫代碼;
            Console.WriteLine("我是Delphi程式員實現的");
        }
    }
    /// <summary>
    /// CSharp程式員實現的WriteCode方法
    /// </summary>
    public class clsCSharpProgramer : IProgramer
    {
        public void WriteCode()
        {
            //用Delphi語言寫代碼;
            Console.WriteLine("我是CSharp程式員實現的");
        }
    }
    /// <summary>
    /// 項目
    /// </summary>
    public class clsProject
    {
        public void WritePrograme(IProgramer programer)
        {
            programer.WriteCode();//寫代碼
        }
    }

這樣的如果再有程式員添加進來的話,我們只需把它們相關的類加進來,然後在main()中稍做修改就OK了。擴充性特別好!

另外我們如果把clsProject這個類封成一個組件,那麼當我們的用戶需要要擴充功能的時候,我們只需要在外部做很小的修改就能實現,可以說根本就用不著改動我們已經封好組件!這樣就很方便,很強大!(出處:http://blog.jobbole.com/85751/)

該文純粹屬於個人學習,有不足之處請多多指教!(文章部分內容摘自網路,如果侵犯您的權益,請及時聯繫我,謝謝。)


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

-Advertisement-
Play Games
更多相關文章
  • Linux通過系統硬體定時器以規律的間隔(由HZ度量)產生定時器中斷,每次中斷使得一個內核計數器的值jiffies累加,因此這個jiffies就記錄了系統啟動開始的時間流逝,然後內核據此實現軟體定時器和延時。 ...
  • 參考:https://wiki.archlinux.org/index.php/Installation_guide_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 安裝準備 連接到網際網路 守護進程 dhcpcd 已被預設啟用來探測有線設備, 並會嘗試連接。如需驗證網路... ...
  • 中斷(interrupt)是指CPU在執行程式的過程中,出現了某些突發事件急待處理,CPU必須暫停執行當前的程式,轉去處理突發事件,處理完畢後CPU又返回原程式被中斷的位置並繼續執行。中斷服務程式的執行並不存在於進程上下文,因此,要求中斷服務程式的時間儘可能地短。因此,Linux在中斷處理中引入了頂... ...
  • 樹莓派是當前最火的嵌入計算平臺沒有之一,樹莓派可以給我們無數的想象,樹莓派的高性能、低功耗、低成本、可擴展性(最新的樹莓派原生支持WIFI和藍牙,這功能太贊了)深受大家的喜愛。雖然樹莓派到目前為止已經很好安裝系統了。但是要想方便的使用和部署開發的軟體還是比較麻煩的。 安裝環境的話,你的有樹莓派硬體( ...
  • 從此刻開始,我已封閉!概不接客! 像風一樣的男人,像風一樣的性格,無拘無束,不拘一格。那麼問題來了,當風遇到沙,不一定你是風兒,我是沙兒的纏纏綿綿,。也許是漫天黃沙,飛粒走石。如果我們期望擒住這漫天的塵埃,必須有強有力的手臂!那麼曬網、撒網、收網!讓他老實的封閉起來吧,永遠相依偎,阿拉! 讀在最前面 ...
  • Vs支持多種語言,但有可能創建項目時,預設的開發語言不是你需要的,比如:預設是Visual C++ 你可以通過"工具"----選項----導入和導出設置來修改。 引用: https://weblogs.asp.net/sreejukg/change-default-language-settings... ...
  • string 與 String,大 S 與小 S 之間有關字元串的秘密 字元串是 String 類型的對象,它的值是文本。 在內部,文本被存儲為 Char 對象的順序只讀集合。 C# 字元串末尾沒有以 null 結尾的字元;因此 C# 字元串可以包含任意數目的嵌入式 null 字元(“\0”)。 字 ...
  • 最近在熟悉Abp框架,其基於DDD領域驅動設計。。。前段可以繞過mvc直接調用根據app層動態生成的webapi,有點神奇~,Web API之前有簡單接觸過,WCF的輕量級版,一般用於做一寫開發性的服務介面,形式上類似與MVC,只是不渲染視圖(其他基於restful設計什麼的我不想去扯)。 因此我的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...