5-3 繼承

繼承的特性

繼承是一種類別的階層式關係,就如同名稱,你可以把繼承當作血緣關係來理解。

舉個例子,假設有個 Pet 類別及 Dog 類別,並使 Dog 類別繼承 Pet 類別。
這時候,Dog 是 Pet 的衍生類別 (derived class);Pet 是 Dog 的基底類別 (base class)。
也有另一種講法,Dog 是 Pet 的子類別 (child class);Pet 是 Dog 的父類別 (parent class)。

繼承後的類別:
● 擁有基底類別所有的成員,包含所有欄位與方法,但不包含建構式與完成項
● 可以使用基底類別的 protected 成員,但仍然無法使用 private 成員 (擁有但無法使用)
● 可以利用 override 修飾詞覆寫 virtual 方法實作 abstract 方法 (注意這裡使用的動詞,等等再回來看一次)

Dog 類別可以使用 Pet 類別的 public 與 protected 成員;無法使用 Pet 類別的 private 成員。
然而,Dog 類別無法使用的這些 private 成員,仍然存在於 Dog 類別,像是隱藏在底部一樣。

下面是繼承的語法:

virtual 與 override 修飾詞

virtual (虛擬) 與 override (覆寫) 這 2 個修飾詞,只能用在方法上,是一組對應使用的修飾詞。

virtual (虛擬) 修飾詞用來表示這個方法的內容可以被繼承的子類別改寫;
而 override (覆寫) 修飾詞只能用在繼承的 virtual 方法上,用來改寫原本的 virtual 方法。

abstract 修飾詞

abstract (抽象) 修飾詞只能用在方法與類別上。
若用在類別上,代表這個類別「是抽象的」,「無法被實體化」。

若要用在方法上,前提條件是只能在抽象類別內使用,
代表這個方法「尚未被宣告」,因此也無法宣告方法的內容。

使用繼承與相關修飾詞的時機

問題來了?我知道這些修飾詞是幹嘛的,但是不理解要怎麼用?什麼狀況下要用?

通常剛入門會有這種疑問蠻正常的,然而:
現在沒辦法理解要怎麼用,即使解釋了,沒有足夠的實作經驗一樣無法理解。
先知道這些修飾詞的意義,至少看別人的程式碼可以知道在寫什麼。
下面仍然稍微談談使用的時機。

當你使用 virtual 修飾詞,就是表示這個方法在其它的衍生類別可能需要被覆寫,
但如果不覆寫,現在這個 virtual 方法的內容就可以被當作預設內容。

抽象類別無法成為實體,因此抽象類別比較像是模板與規範。
當繼承了抽象類別,就得實作其中宣告的每一個 abstract 方法。
因此當你建立 abstract 類別時,就是在建立一組規範;
當你宣告 abstract 方法時,就是建立抽象類別的其中一個規範,只是不確定或不限制實作細節。