什麼是抽象類(Abstract)
抽象類就是聲明爲抽象的類,具有以下特點。
- 不能實例化,即不能new一個對象出來;
- 可以被繼承;
- 可以包含抽象方法,也可以沒有抽象方法(抽象方法是使用Abstract聲明,但是沒有實現);
- 可以有靜態字段和靜態方法;
- 非抽象子類必須實現所繼承的抽象類的所有抽象方法;
下面是抽象類的示例。
abstract class SampleAbstract
{
public static string CommonInfo = "commoninfo";
private string privateInfo = "private Info";
public string Name { get; set; } = "";
public void ShowPrivateInfo()
{
Console.WriteLine(privateInfo);
}
public abstract void Method1();
}
什麼是接口
本節主要摘自:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/
接口定義了一個規定(contract,又稱爲合同等),任何類或者結構(struct)要實現這個接口,那麼必須實現接口中的規定。
從C#8.0開始,接口可以定義默認實現。
爲了描述本質信息,以下的說明都是基於C#8以下的版本。
接口具有以下特點。
- 具有方法、屬性、索引器、事件等成員(默認爲public,因此不用修飾符);
- 接口可以繼承自一個類或者若干個接口(類必須排在第一位);
- 繼承了接口的類或者結構必須實現接口的成員。
- 接口無法直接進行實例化。
下面看個例子。
public interface ISampleInterface
{
void TeSampleMethods();
}
class ImplementationClass:ISampleInterface
{
public void TeSampleMethods()
{
Console.WriteLine("I am Implementation.");
}
}
有兩種使用方法。
static void Main(string[] args)
{
ISampleInterface obj1 = new ImplementationClass();
obj1.TeSampleMethods();
ImplementationClass obj2 = new ImplementationClass();
obj2.TeSampleMethods();
Console.Read();
}
執行結果。
In the following example, class ImplementationClass must implement a method named SampleMethod that has no parameters and returns void.
For more information and examples, see Interfaces.
Example
接口和抽象類的異同點
參考自以下。
https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/
抽象類 | 接口 |
---|---|
包含聲明和定義(實現) | 僅包含聲明 |
不能進行多繼承(一個類最多隻能繼承自一個抽象類) | 能進行多個繼承 |
包含構造器(構造函數) | 不能包含構造函數 |
可以包含靜態成員 | 不能包含靜態成員 |
可以包含各種修飾符,如public、private、protected等 | 只包含public類型,因爲接口中的任何成員都是public |
抽象類運行較快 | 接口運行較慢,因爲需要時間搜索相應的類的實際方法 |
可以包含方法、常量、字段等 | 只能包含方法類型(方法、屬性等) |
包含的方法可以全部實現、部分實現或者不實現(子類也是抽象類,則可以部分實現父類的抽象方法) | 方法必須全部實現 |
如何選擇使用
從上節的抽象類和接口異同,可以得到如下結論:
- 如果需要實現多個類的內在共同特徵(通過常量、字段、非抽象方法等體現),使用抽象類;如果主要體現實現類的外部功能(共同的方法),使用接口;
其它參考資料
https://dzone.com/articles/when-to-use-abstract-class-and-intreface