我們都知道虛方法實現多態,抽象方法實現多態等,我們今天來看看如何使用介面實現多態 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.介面總結(摘錄):
介面是組件之間的協議,描述了組件對外提供的服務。從技術上講介面是一組包含了函數型方法的數據結構。 通過這組數據結構,客戶代碼可以調用組件對象的功能。介面可以從父介面中繼承。介面的繼承首先是說明性繼承,不是實現性繼承,它的實現需要通過類或結構來實現;其次介面繼承可以是多繼承。
屬性的本質是方法,索引器的本質是屬性。
介面包含的成員有方法、屬性、索引指示器和事件。由於介面允許多繼承,在可能發生二義性的地方可以採用全權名來避免。可以用類來實現介面。在類中定位介面成員的實現稱之為介面映射。類必須為介面的所有成員提供具體的實現,包括介面中顯式定義的成員, 以及介面從父介面中繼承而來的成員。同樣,在對介面的實現過程中可以採用顯式介面成員執行體來避免產生二義性。派生類可以對基類已經實現的介面進行重實現。
抽象類也可以實現介面,但介面成員必須映射到抽象類的抽象成員。抽象類的派生類如果是非抽象類,則必須通過方法重載來實現介面成員。