前言:相信在生活中,"接口"這個詞對於大家來說都不陌生吧,比如說:很多不同的軟件都擁有查看天氣這個功能,難道說每個軟件都有對應的氣象局?這是因爲氣象局給了它們一個接口,進而實現天氣功能的,顯而易見接口的作用了,今天跟隨博主一起來了解一下"接口"吧::::
目錄:
一.接口含義:
接口定義了所有類繼承接口時應遵循的語法合同。接口定義了語法合同 “是什麼” 部分,派生類定義了語法合同 "怎麼做"部分。通俗來講就是接口定義了一些行爲,繼承接口的類應該必須擁有這些行爲,按照這些行爲去做…
二.接口的聲明:
接口必須用關鍵字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();
}
}
運行結果:
以上是我對接口的一些瞭解,若有不足海望大家提出,謝謝😃😦😃