c#基礎之接口

接口關鍵字:interface

接口的定義:是指一組函數成員而不實現成員的引用類型,其他類型和接口可以繼承接口。

接口的特點:

  1. 通過接口可以實現多重繼承,c#接口的成員不能包含public、protected、internal、private等修飾符。原因是很簡單的,因爲接口裏面的方法都需要外面的接口是實現方法體,那麼修飾符必然是public。c#接口中的成員默認是public的。
  2. 接口成員不能有new、static、abstract、override、virtual修飾符。但是有一點要注意的是*當一個接口實現一個接口,兩個接口有同樣的方法時,可以用new關鍵字用來隱藏父接口中的方法*。
  3. 接口中只包含成員的簽名,接口中沒有構造函數,所以不能直接使用new關鍵字對接後實例化。接口中只能包含方法的屬性、事件和索引的組合。接口一旦被實現,實現類必須實現接口中的所有成員,除非實現類本身是抽象類。
  4. c#是單繼承,接口是結局也c#裏面類可以同時竭誠多個基類的問題。
  5.  接口是一個規範,能力,爲了多態,接口不能被實例化,用interface;接口不允許包含字段。方法體,可以寫自動屬性
  6. 接口可以繼承接口,不能繼承一個類
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class interfaceTest : MonoBehaviour {
    private void Awake()
    {
        //在c#中COM接口是可以實例化的,但其實這種寫法是使接口“映射”到某一個類中
        //實際上是創建這個類的實例
        IWorker i = new IWorker();
        //從這個例子我們很好地理解了接口的好處,如果又來一個新的工作者
        //如果不採用接口,每個員工就需要有一個單獨的類,這樣就很容易出錯
        //如果又接口這種協議約束的話,那麼要實現接口就肯定有接口中聲明的方法,我們只需要拿來調用就好了
        IWorker worker = new Jame1();
        IWorker worker2 = new Jame2();
        worker.work("設計");
        worker2.work("程序");
    }

}
//工作者接口
//ComImport特性發生在tlbimp.exe導入COM類型類庫的時候,生成的託管類型會標記有ComImport特性
//Guid特性是一個GUID標識,COM類型是用GUID來標識的。
[ComImport, CoClass(typeof(Jame1))]
[Guid("d60908eb-fd5a-4d3c-9392-8646fcd1edce")]
public interface IWorker
{
    void work(string a);
}
class Jame1 : IWorker
{
    public void work (string s)
    {
        Debug.Log("我的名字是Jame1,我的工作是" + s);
    }
}
class Jame2 : IWorker
{
    public void work (string s)
    {
        Debug.Log("我的名字是Jame2,我的工作是" + s);
    }
}

  • 接口和抽象類的區別 

1、接口用於規範,抽象類用於共性。 
2、接口中只能聲明方法,屬性,事件,索引器。而抽象類中可以有方法的實現,也可以定義非靜態的類變量。 
3、抽象類是類,所以只能被單繼承,但是接口卻可以一次實現多個。 
4、抽象類可以提供某些方法的部分實現,接口不可以。 
5、抽象類的實例是它的子類給出的。接口的實例是實現接口的類給出的。 
6、在抽象類中加入一個方法,那麼它的子類就同時有了這個方法。而在接口中加入新的方法,那麼實現它的類就要重新編寫。 
7、接口成員被定義爲公共的,但抽象類的成員也可以是私有的、受保護的、內部的或受保護的內部成員(其中受保護的內部成員只能在應用程序的代碼或派生類中訪問)。 
8、接口不能包含字段、構造函數、析構函數、靜態成員或常量。

  •  C#中接口和抽象類的使用上的區別:

  1. 抽象類不能被實例化,但能擁有自己的成員字段和非抽象的方法,但是接口比抽象類更加抽象其成員只能是一般的方法、屬性和索引函數,不能擁有自己的成員字段了構造函數
  2. 用abstract成聲明的抽象類必須有訪問權限修飾符如publlic等關鍵字進行修飾,其次抽象類裏面的方法需用abstract聲明爲抽象方法或者用virtual聲明爲虛擬方法非抽象方法除外,虛擬方法有簡單執行代碼,派生類中可以選擇不重載,抽象方法沒有任何執行代碼,派生類中必須重載)。在其派生類中重載抽象方法或虛擬方法時必須用override修飾。而在用interface聲明的接口類中的接口方法第一不允許是靜態的,其次除了無執行代碼外不能加任何訪問限制修飾符,且不能用virtual或abstract進行修飾。同時在直接支持其接口的類型中不能用override修飾符來表示重載方法,且必須支持即實現該接口中的所有方法。但可以用new關鍵字來隱藏父接口中的方法。
  3. 接口、抽象類、非抽象類都可以繼承接口
  4. 繼承接口後對其接口方法的實現: 實現可以分爲“顯示實現”和”隱式實現“
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章