C# — 抽象類別與介面

謝駿辰
Jason的網頁筆記
Nov 21, 2021
Photo by Kelly Sikkema on Unsplash

網站已搬家,請到新網站支持我呦> https://jasonhsieh-web.github.io/

抽象類別

將類別之間的共同特性,從類別中萃取出來的動作,就稱之為「抽象化」,如交通工具封裝一些特性,再透過繼承的方式由子類別來展現這一些特性:如汽車、腳踏車、機車。如果是不同類型物件間的共同特性,則可以定義成介面。

抽象類別就是將同種類類別的共通特性,定義到父類別中,再透過繼承的動作,讓子類別都可以具備一致的特性。以上面交通工具的角色就是用來定義所有交通工具的”共同特性”。像這種類別,就稱為「抽象類別」。

抽象類別可以含抽象成員的類別,但無法使用「new」關鍵字建立物件。

現在假設定義一個「Shape」類別來描述所有形狀的共同特性,而在此類別中設計一個「ShowInfo」方法,但不同種類的「Shape」,要顯示的訊息不同,因此「ShowInfo」需要加上virtual關鍵字讓子類別可以override。像「ShowInfo」這一種在每個子類別中,都需要覆寫才可以使用的方法,在物件導向中可以宣告為「抽象方法」。

繼承抽象類別的子類別中,必須實作所有抽象成員,子類別使用override宣告抽象方法實作。

下圖宣告Rectangle和Circle繼承Shape,可以看到不同的子類別因各自定義不同的抽象成員的實作方法,因此也會產生多型的現象。

介面

在C#中可以利用interface定義介面來模擬多重繼承,界面和類別一樣可以定義屬性、方法、事件。不同的地方在於介面僅可定義抽象成員,不包含實作的部分,實作部分留給繼承此介面的類別來實作。定義介面習慣以大寫I來命名。

介面與抽象類別的比較

介面跟抽象類別都是屬於物件導向抽象化的產物,但有兩個主要不同點:

抽象類別主要是定義同種類物件所需要具備的基本特性,因此需要被繼承之後,這些特性才會展現在子類別中。

介面則是用來定義不同種類物件,提供相同功能所需要具備的特性。因此不同種類的物件,實作相同的介面就會有相同的功能。

抽象類別中,可以定義實體成員。雖然抽象類別不能直接建立實體,但是這些實體的特性會被繼承到子類別中。

如果我的筆記對您有幫助的話,不吝嗇給我個clap哦~ 謝謝您 !

--

--