這篇文章主要介紹了介面的概念、定義和實現,以及顯式/隱式實現介面的場景。文章還對介面和抽象類進行了比較,指出它們的區別。同時,文章提供了詳細的代碼示例,方便讀者理解和實踐。 ...
1.什麼是介面
介面可以認為是一種規範,它是一種類的構建規範,它裡面定義了一系列的方法和類型,但是沒有具體的實現,需要繼承它的類去自我實現
2.介面的定義
使用 VS2022 在解決方案管理器這裡,添加新建項
在添加新建項模板這裡,選擇介面
最後創建出來的介面如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace classTest
{
internal interface Interface1
{
}
}
介面的註意點
:
- 在介面中定義的方法不能添加任何的修飾符,介面的方法預設是 public
- 在介面中可以定義屬性、事件、索引器、方法,或者這四類成員的任意組合,但是介面不能包含欄位、運算符重載、實例構造函數和析構函數
- 介面的所有成員預設都是公共的,不能用public、private、protected來修飾,也不能用static修飾
3.實現介面
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace classTest
{
public class Person : ICustomCompare
{
int age;
public int Age { get { return age; } set { age = value; } }
public int compareTo(object other)
{
if (other == null) {
return 1;
}
// 這裡強制類型轉換一手
Person value = (Person)other;
if (value.age > this.age)
{
return -1;
}
else
{
return 1;
}
return 0;
}
}
}
using classTest;
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.Age = 10;
Person p2 = new Person();
p2.Age = 20;
if (p1.compareTo(p2) > 0)
{
Console.WriteLine("p1 > p2");
}
else if (p1.compareTo(p2) < 0)
{
Console.WriteLine("p1 > p2");
}
else {
Console.WriteLine("一樣大");
}
}
}
4.顯式的實現介面
之前我們的實現方式是隱式的實現介面的方式,即沒有指出是哪個介面的compareTo()方法
而現在是顯式的實現方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace classTest
{
internal interface ICustomCompare
{
int compareTo(object other);
}
// 中國人打招呼的方式
internal interface IChineseGreeting
{
void sayHello();
}
// 美國人打招呼的方式
internal interface IAmericanGreeting {
void sayHello();
}
}
我們可以發現,上面的代碼中,IChineseGreeting、IAmericanGreeting這兩個介面,都有sayHello方法,當我們有一個類去實現兩個介面的時候,會出現一個問題,就是,我們到底是在實現IChineseGreeting的sayHello()方法,還是在實現IAmericanGreeting的sayHello()方法,還是同時實現?
最後我們發現是兩個介面的實現方式都一樣,但是如果,我們想要有不同的實現方式,就需要顯式的實現介面
下麵這種方式就是顯式的實現介面
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace classTest
{
internal class Speaker : IAmericanGreeting, IChineseGreeting
{
// 顯式的實現介面
void IChineseGreeting.sayHello()
{
Console.WriteLine("你好");
}
void IAmericanGreeting.sayHello()
{
Console.WriteLine("Hello");
}
}
}
顯式實現介面的註意點
:
- 若顯式實現介面,方法不能使用任何的訪問修飾符,顯式實現的成員都預設為私有
- 顯式實現的成員預設都是私有的,這些成員都不能通過類的對象進行訪問
5.顯式/隱式實現介面的場景
- 採用隱式介面實現時,類和介面都可以訪問介面中的方法,而採用顯式實現介面,介面的方法只能通過介面來訪問,因為此時介面的方法預設為私有
- 當類實現單個介面時,通常使用隱式介面實現
- 當類實現多個介面時,並且介面的方法名稱、參數和返回類型都相同的時候,則應該使用顯式介面實現
6.介面與抽象類
介面與抽象類的區別主要有以下幾點
- 抽象類使用
abstract
關鍵字定義,而介面使用interface
進行定義;它們都不能進行實例化 - 抽象類中可以包含虛方法、非抽象方法、和靜態成員,介面中不能包含虛方法和任何的靜態成員,並且介面中只能定義方法,不能有具體實現,方法具體由實現類來完成
- 抽象類不能實現多繼承,介面支持多實現
- 抽象類是對一類對象的抽象,繼承與抽象類與抽象類為屬於的關係;而類實現介面,只是代表實現類具有介面聲明的方法,是一種Can-do的關係,所以介面後一般帶有able的欄位,表示能做