C#中關於接口(Interface)的詳解(附帶案例)

前言:相信在生活中,"接口"這個詞對於大家來說都不陌生吧,比如說:很多不同的軟件都擁有查看天氣這個功能,難道說每個軟件都有對應的氣象局?這是因爲氣象局給了它們一個接口,進而實現天氣功能的,顯而易見接口的作用了,今天跟隨博主一起來了解一下"接口"吧::::

一.接口含義:

接口定義了所有類繼承接口時應遵循的語法合同。接口定義了語法合同 “是什麼” 部分,派生類定義了語法合同 "怎麼做"部分。通俗來講就是接口定義了一些行爲,繼承接口的類應該必須擁有這些行爲,按照這些行爲去做…

二.接口的聲明:

接口必須用關鍵字interface來進行聲明,一般格式如下所示:

訪問修飾符 interface interface_name
{ 
     接口成員
}

舉例:我們定義了一個接口…

 interface INmyface//接口一
    {
    }

😃接口的默認修飾符爲public哦 !
注意:接口只能用 public 和 internal 訪問修飾符!!!否則就會報錯,例如:
在這裏插入圖片描述
在這裏插入圖片描述

三.接口成員:

1.接口成員的包含:

接口成員:接口只包含方法、屬性、索引器和事件的簽名

2.接口成員的定義:

接口成員定義與類成員定義相似,但是要注意:接口中成員變量的默認訪問修飾符爲 final ,成員方法的默認訪問修飾符爲 static
1. 接口成員不允許使用訪問修飾符(public,private,protected 或 internal),所有的接口成員都必須是公共的;
舉例:
在這裏插入圖片描述
2.接口成員不能用關鍵字static,virtual,abstrac t或 sealed 來對其定義;
舉例:
在這裏插入圖片描述
3. 接口成員不能包含代碼實體;
4.接口成員不能定義字段成員;
舉例:我們定義了一個字段 A 會提示報錯:
在這裏插入圖片描述

3.舉例:

我們定義了一個接口,並定義了幾個接口成員:

  interface INmyface//接口一
    {
        //4個方法
        void Run();
        void Say();
        void Eat();
        void Sleep();
        //一個屬性
        int Age { get ; set; }
    }

四.接口的特點:

1. 接口必須用interface進行聲明;

 interface INmyface//接口一
    {
    }

2. 接口中只能放成員的聲明;

 interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
    }

3. 繼承接口必須實現接口中的所有成員,如果在接口中新增成員的聲明,而在繼承的類中沒有進行實現時,就會報錯,如:
在這裏插入圖片描述
4. 接口之間可以互相繼承,但是要實現接口功能的派生類必須實現每個接口的成員:
如:我們定義了一個接口INmyface,另一個接口INsecond繼承了INmyface這個接口,那麼當子類繼承INsecond這個接口時,就要實現這兩個接口中所有的成員:

 interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
        void DDD();
    }
    interface INsecond : INmyface//繼承接口,接口之間的繼承
    {
        void Day();
    }
     class Son : INsecond 
    {
        public int Age { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public void Day()//繼承接口以後,接口二獨有的方法
        {
            Console.WriteLine("我是第二個接口中獨有的方法");
        }
        public void DDD()
        {
            Console.WriteLine("我會打遊戲,---來自第一個接口");
        }
        public void Eat()
        {
            Console.WriteLine("我會喫,---來自第一個接口");
        }
        public void Run()
        {
            Console.WriteLine("我會跑---來自第一個接口");
        }
        public void Say()
        {
            Console.WriteLine("我會說話---來自第一個接口");
        }
        public void Sleep()
        {
            Console.WriteLine("我會睡覺---來自第一個接口");
        }
    }

如果說,我們只實現了第一個接口的成員,而沒有實現第二個接口獨有的成員,那麼就會報錯,如下圖所示:
在這裏插入圖片描述
溫馨提示: 在上面舉例中,我們只實現了第一個接口的成員,忽略了第二個接口的成員,那麼系統就會報錯,在此提醒小夥伴們千萬別忘記一定要實現所有的成員哦!
5.一個類可以繼承多個接口,但是每個接口的成員必須進行實現:
注:在繼承多個接口時每個接口之間用","進行連接
舉例:

interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
        void DDD();
    }
interface INseconde//接口二
    {
        void Day();
    }
    interface INThird//接口三
    {
        void Sun();
    }
    class Son : INseconde,INmyface, INThird
    {}
    //在此舉例時就不再次寫實現成員的過程了

如果忘記了任何一個接口成員時,就會:
在這裏插入圖片描述

五.接口的實現:

前面說了那麼多,那接口到底怎樣在派生類中進行實現呢?,一般有兩種實現形式:

1.隱式實現:

所謂的隱式實現就是對其中的方法等進行重寫,舉例:

public void DDD()
        {
            Console.WriteLine("我會打遊戲,---來自第一個接口");
        }

2.顯示實現:

顯示實現:使用接口名點成員實現,創建一個僅通過該接口調用並且特定於該接口的類成員。這是使用接口名稱和一個句點命名該類成員來實現的:類型 接口名稱.方法{}
舉例,我們在原有接口中對INseconde中的方法和INmyface中的屬性進行顯示實現:(因爲我們只更改這兩個所以只寫了這兩個)

   class Son : INseconde,INmyface, INThird
    {
        int INmyface.Age
        {
            get;
            set;
        }
        void INseconde.Day()
        {
            Console.WriteLine("我是第二個接口中獨有的方法");
        }
     }

main函數中,因爲用到了一個全新的概念申明類,這個知識點在下篇文章將會介紹到:

 static void Main(string[] args)
        {
            //Son son = new Son();
            //申明類
            INmyface nn = new Son();
            INseconde nmyface = new Son();
            nmyface.Day();
            nn.Age = 1;
            Console.WriteLine("這是第{0}次瞭解接口",nn.Age);
            Console.ReadLine();
        }

運行結果:
在這裏插入圖片描述

3.隱式實現與顯示實現的區別:

兩者最大的區別就在於,隱式實現是接口和類都可以進行訪問,顯示實現只有接口可以進行訪問!

六.使用接口的目的(作用):

1.一個接口內,允許包含變量、常量等一個類所包含的基本內容。但是,接口中的函數不允許設定代碼,也就意味着不能把程序入口放到接口裏。由上可知,接口是專門被繼承的。接口存在的意義也是被繼承;
2.接口的主要目的是爲不相關的類提供通用的處理服務,由於C#中只允許樹形結構中的單繼承,即一個類只能繼承一個父類,所以接口是讓一個類具有兩個以上基類的唯一方式;

七.接口應用的詳細舉例:

 interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
        void DDD();
    }
    interface INseconde:INFour//接口二
    {
        void Day();
    }
    interface INThird//接口三
    {
        void Sun();
    }
    interface INFour//接口用於被繼承
    {
        void Sum();
    }
    class Son : INseconde,INmyface, INThird
    {
    //1.顯示實現
       // int INmyface.Age
       // {
       //     get;
       //     set;
        //}
     //2.隱式實現
        public int Age {
            get { return 1; }
            set { Age = value; }  
        }
        //1.顯示實現
         //void INseconde.Day()
        //{
         //   Console.WriteLine("我是第二個接口中獨有的方法");
        //}
        //2.隱式實現
        public void Day()//繼承接口以後,接口二獨有的方法
        {
            Console.WriteLine("我是第二個接口中獨有的方法");
        }
        public void DDD()
        {
            Console.WriteLine("我會打遊戲,---來自第一個接口");
        }
        public void Eat()
        {
            Console.WriteLine("我會喫,---來自第一個接口");
        }
        public void Run()
        {
            Console.WriteLine("我會跑---來自第一個接口");
        }
        public void Say()
        {
            Console.WriteLine("我會說話---來自第一個接口");
        }
        public void Sleep()
        {
            Console.WriteLine("我會睡覺---來自第一個接口");
        }
        public void Sum()
        {
            Console.WriteLine("我是用來統計的,---來自接口的繼承");
        }
        public void Sun()
        {
            Console.WriteLine("今天是晴天,---我來自第三個接口");
        }
         class Program
    {
        static void Main(string[] args)
        {
            Son son = new Son();
            INmyface nn = new Son();
            INseconde nmyface = new Son();
            nmyface.Day();//顯示實現
            nn.Age = 1;//顯示實現
            son.Run();
            Console.ReadLine();
            //son.Say();
            //Console.ReadLine();
            son.Eat();
            Console.ReadLine();
            son.Sleep();
            Console.ReadLine();
            son.Day();
            Console.ReadLine();
            son.DDD();
            Console.ReadLine();
            son.Sum();
            Console.ReadLine();
            son.Sun();
            Console.ReadLine();
            Console.WriteLine("這是第{0}次瞭解接口",nn.Age);
            //Console.WriteLine("這是第{0}次瞭解接口",son.Age);
            Console.ReadLine();
        }
    }

運行結果:
在這裏插入圖片描述


以上是我對接口的一些瞭解,若有不足海望大家提出,謝謝😃😦😃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章