【轉 】C#中的介面實現多態

來源:互聯網
上載者:User

標籤:需要   read   html   collect   mil   技術分享   oba   tail   eric   

C#中的介面實現多態

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

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.介面總結(摘錄):

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

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

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

 

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

【轉 】C#中的介面實現多態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.