C#中的介面實現多態

来源:http://www.cnblogs.com/zhangzongle/archive/2016/04/12/5385068.html
-Advertisement-
Play Games

我們都知道虛方法實現多態,抽象方法實現多態等,我們今天來看看如何使用介面實現多態 1.首先我們先要來瞭解瞭解什麼是介面,它存在的意識 01.介面就是為了約束方法的格式(參數和返回值類型)而存在的 02.介面可以實現多繼承,彌補單繼承的缺陷。 03.介面可以看成是一個特殊的抽象類,通過反編譯看源碼可知 ...


我們都知道虛方法實現多態,抽象方法實現多態等,我們今天來看看如何使用介面實現多態

1.首先我們先要來瞭解瞭解什麼是介面,它存在的意識

    01.介面就是為了約束方法的格式(參數和返回值類型)而存在的

    02.介面可以實現多繼承,彌補單繼承的缺陷。

  03.介面可以看成是一個特殊的抽象類,通過反編譯看源碼可知

    04.介面中方法不用訪問修飾符,因為CLR會自動添加,並且不能有方法體

    05.如果一個類實現了某個介面,就得實現該介面中所有的方法

    06.介面要謹慎使用,防止出現介面污染!

    07.介面僅僅代表一種能力,實現該介面的類和介面沒有繼承關係

    08.介面是用來實現的,類是用來繼承的。

    09.其實很多時候,看似可以不用介面,因為介面就是一個方法的約定,

    表明你這個類必須要有某些方法,但是不寫介面也可以有這些方法,用了介面,

    就可以使用介面變數,統一調用,實現多態

   10.介面中只能定義方法,不能定義變數。

2.抽象類和介面的區別:

當需要的各個對象之間存在父子類關係時,可以考慮使用抽象類,

當各個對象之間不存在繼承關係,只是有相同的能力時,而已考慮使用介面

3.介面的通俗理解

   01.飛機會飛,鳥會飛,他們都繼承了同一個介面“飛”;但是F22屬於飛機抽象類,

   鴿子屬於鳥抽象類。

   02.就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),

   但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);

   一個門可以有鎖(介面)也可以有門鈴(多實現)。

   門(抽象類)定義了你是什麼,介面(鎖)規定了你能做什麼

   (一個介面最好只能做一件事,你不能要求鎖也能發出聲音吧(介面污染))

   

 

下麵我們舉個用介面實現多態的例子:

01.新建一個飛的介面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 介面
{
    //飛的介面
   public interface IFly
   {
       //介面中方法不用訪問修飾符,因為CLR會自動添加,並且不能有方法體
       void Say();

   }
}

02.創建一個吃的介面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 介面
{
    //吃的介面
   public interface IEat
   {
       //介面中方法不用訪問修飾符,因為CLR會自動添加,並且不能有方法體
       void eat();
   }
}

03.創建一個鳥類來實現飛的介面和吃的介面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 介面
{
    //鳥實現飛的介面和吃的介面 
    public class Grid:IFly,IEat   //註意  介面:介面叫繼承  ,類:介面叫實現
    {

        //如果一個類實現了某個介面,就得實現該介面中所有的方法
        public void Say()
        {
            Console.WriteLine("鳥在飛");
        }

        public void eat()
        {
            Console.WriteLine("鳥在吃");
        }
    }
}

04.創建一個飛機類實現飛的介面

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 介面
{
    //飛機實現飛的介面
   public class Plan:IFly
    {

        public void Say()
        {
            Console.WriteLine("飛機在飛");
        }
    }
}

05.在Main方法實現調用

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 介面
{
    class Program
    {
        static void Main(string[] args)
        {
            //定義飛介面數組實例化對象
            IFly[] iFlies =
            {
                new Grid(), 
                new Plan()
            };
            //迴圈數組調用方法實現多態
            foreach (IFly iFly in iFlies)
            {
                iFly.Say();
            }
            //鳥吃實例化對象
            IEat iEats = new Grid();
            //調用方法實現多態
            iEats.eat();
            
            Console.ReadLine();
        }
    }
}

這樣就可實現多態了,運行結果如下:

 

註:如果有一個類要實現兩個介面,不巧的是這兩個介面(如:IFly,IPlay)中右兩個同命名的方法(Eat)

我們都知道

如果一個類實現了某個介面,就得實現該介面中所有的方法

這怎麼辦吶?自有解決的方法的:

  我們就可以使用介面名.方法來實現

 

  //實現了IFly和IPlay兩個介面,但兩個介面中都有Eat方法
   public class Dog:IFly,IPlay
    {
        //如果一個類實現了某個介面,就得實現該介面中所有的方法
       //這樣我們就可以使用介面名.方法來實現
        void IFly.Eat()
        {
            
        }

        void IPlay.Eat()
        {
            
        }
    }

 4.介面總結(摘錄):

     介面是組件之間的協議,描述了組件對外提供的服務。從技術上講介面是一組包含了函數型方法的數據結構。 通過這組數據結構,客戶代碼可以調用組件對象的功能。介面可以從父介面中繼承。介面的繼承首先是說明性繼承,不是實現性繼承,它的實現需要通過類或結構來實現;其次介面繼承可以是多繼承。

 屬性的本質是方法,索引器的本質是屬性。

      介面包含的成員有方法、屬性、索引指示器和事件。由於介面允許多繼承,在可能發生二義性的地方可以採用全權名來避免。可以用類來實現介面。在類中定位介面成員的實現稱之為介面映射。類必須為介面的所有成員提供具體的實現,包括介面中顯式定義的成員, 以及介面從父介面中繼承而來的成員。同樣,在對介面的實現過程中可以採用顯式介面成員執行體來避免產生二義性。派生類可以對基類已經實現的介面進行重實現。

 

       抽象類也可以實現介面,但介面成員必須映射到抽象類的抽象成員。抽象類的派生類如果是非抽象類,則必須通過方法重載來實現介面成員。


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

-Advertisement-
Play Games
更多相關文章
  • 方法All返回布爾值bool,判斷集合中是否所有元素都滿足某一條件,通俗一點說,就是每一個元素,均符合同一個條件,它才返回真,不然返回假。舉列,創建一個model: source code: namespace Insus.NET.Models { public class Book { publi ...
  • 1.開篇之前先說一說NISI是什麼。 NSIS(Nullsoft Scriptable Install System)是一個開源的 Windows 系統下安裝程式製作程式。它提供了安裝、卸載、系統設置、文件解壓縮等功能。這如其名字所指出的那樣,NSIS 是通過它的腳本語言來描述安裝程式的行為和邏輯的 ...
  • 轉載自乎聲 前 一天準備下載VS2015預覽版,到VisualStudio官網一看,發現微軟發佈了VisualStudio2013的插件——Visual Studio Tools for Apache Cordova,實現跨平臺的開發。官網下載地址:http://www.microsoft.com/ ...
  • 朋友們,還記得我們在C#語言開發中用到過索引器嗎? 記得在獲得DataGridView控制項的某列值時:dgvlist.SelectedRows[0].Cells[0].Value; 記得在獲得ListView控制項的某列值時:listView1.SelectedItems[0].SubItems[0] ...
  • 1,工資計算公式 每一個企業都一定會用到工資計算,發工資是一件非常神聖的事情,而計算工資就是一項非常重要的工作。Excel有非常強大的公式功能,幫助了很多財務人員計算工資,但如果企業的人數比較多,而且工資的計算公式比較複雜,那使用Excel的人員必須是一個超高手了,但Excel維護起來也是非常困難的 ...
  • AjaxControlToolkit是一組控制項的集合,可以實現自動補充文本框,點擊文本框彈出日曆,加水印等Ajax效果,包含40多個控制項,具體實現效果如:http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/Default.aspx ...
  • 通常,我們藉助瀏覽器(通常是IE,FireFox或者Chrome)瀏覽網頁,例如,我們在地址欄中輸入DebugLZQ的博客網址http://www.cnblogs.com/DebugLZQ/,回車之後,就會在瀏覽器的視窗中看到Debug的主頁,如下圖所示: 在這個簡單的操作背後影藏了巨大的複雜性。 ...
  • 3月底,微軟正式宣佈:Xamarin免費了!那麼,你能做什麼? 搶先一步,用Xuni助力你的Xamarin開發! Xamarin是什麼 Xamarin含Xamarin.Andoid,Xamarin.iOS和Xamarin.Mac平臺,可讓你使用C#和Visual Studio或Xamarin IDE ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...