一、接口的概念
1. 概念:接口是行為的抽象規范,也是一種自定義類型
2. 接口聲明規范:
? ? ? ? (1)不包含成員變量
? ? ? ? (2)只包含屬性、方法、索引器、事件
? ? ? ? (3)成員不能被實現
? ? ? ? (4)成員可以不寫訪問修飾符(默認public),不能是私有的
? ? ? ? (5)接口不能繼承類,但是可以繼承另一個接口
3. 接口使用規范
? ? ? ? (1)類可以繼承多個接口
? ? ? ? (2)類繼承接口后,必須實現接口中所有成員
4. 特點:
? ? ? ? (1)接口的聲明和類的聲明類似
? ? ? ? (2)接口是用來繼承的
? ? ? ? (3)接口不能被實例化,但是可以作為容器存儲對象
二、接口的聲明
1. 關鍵字:interface
2. 語法:
interface 接口名
{
}
3. 作用:接口是抽象行為的“基類”
4. 命名規范:I + 帕斯卡命名
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}
}
三、接口的使用
1.?類可以繼承一個父類,n個接口
2.?類繼承接口后,必須實現接口中的所有內容,并且必須是public的
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}public void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}
}
3.?實現的接口函數,可以加virtual再在子類重寫
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}
}
4. 接口也遵循里氏替換原則
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();}}
}
5. 接口可以繼承接口
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}interface IWalk // 聲明第二個接口{void walk();}interface IMove : IFly, IWalk // 接口繼承接口{void move(string value);}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Person : IMove{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get {return index;}set {}}public virtual void fly() // 實現接口方法{Console.WriteLine("人乘坐飛機飛了" + Height + "米");}public void walk() // 實現接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 實現接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();// 都遵循里氏替換原則IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();}}
}
四、顯式實現接口
1. 作用:當一個類繼承多個接口,而接口中存在同名方法時,使用顯式實現接口
2. 語法:接口名.函數名() {}
3. 代碼:
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}interface IWalk // 聲明第二個接口{void walk();}interface IMove : IFly, IWalk // 接口繼承接口{void move(string value);}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Person : IMove{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get {return index;}set {}}public virtual void fly() // 實現接口方法{Console.WriteLine("人乘坐飛機飛了" + Height + "米");}public void walk() // 實現接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 實現接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}/*----------------------------------------------------------*/// 顯式實現接口interface IAtk{void atk();}interface ISkill{void atk();}class Player : IAtk, ISkill // 實現多個接口{void IATK.atk() // 顯式實現接口方法{Console.WriteLine("玩家普通攻擊");}void ISkill.atk() // 顯式實現接口方法{Console.WriteLine("玩家釋放技能攻擊");}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();// 都遵循里氏替換原則IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();}}
}
4. 注意:
? ? ? ? 若使用子類容器,則無法調用顯式實現接口的方法,需要轉換尾父類容器。
using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}interface IWalk // 聲明第二個接口{void walk();}interface IMove : IFly, IWalk // 接口繼承接口{void move(string value);}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Person : IMove{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get {return index;}set {}}public virtual void fly() // 實現接口方法{Console.WriteLine("人乘坐飛機飛了" + Height + "米");}public void walk() // 實現接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 實現接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}/*----------------------------------------------------------*/// 顯式實現接口interface IAtk{void atk();}interface ISkill{void atk();}class Player : IAtk, ISkill // 實現多個接口{void IAtk.atk() // 顯式實現接口方法{Console.WriteLine("玩家普通攻擊");}void ISkill.atk() // 顯式實現接口方法{Console.WriteLine("玩家釋放技能攻擊");}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();// 都遵循里氏替換原則IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();Player player = new Player();// person.atk(); // 調用接口方法, 編譯報錯Console.WriteLine("轉換為IATK類:");(player as IAtk)?.atk(); // 顯式實現接口方法,調用時需要轉換類型Console.WriteLine("轉換為ISkill類:");(player as ISkill)?.atk(); // 顯式實現接口方法,調用時需要轉換類型}}
}
????????至此,面向對象的三大特性之一:多態就學習完了。
? ? ? ? 今天的學習就到這里了,感謝閱讀。
? ? ? ? 再見!