2016年5月4日 星期三

小山的 C# 教學-第34課-Base 關鍵字

本課簡介

本課介紹在繼承中也時常用到的 base 關鍵字
這個關鍵字能讓衍生類別直接存取到基底類別的屬性與方法

教學影片

注意:影片有高畫質 720P 的選項,可以看得更清楚喔!



重點提示

1. 透過 this 關鍵字可以直接存取所屬物件的屬性與方法,常用於 method 的參數名稱與屬性名稱重複的時候。base 關鍵字也是類似原理,只是 base 存取的對象是基底類別 (base class)

2. 第一種可能用到 base 的狀況:當衍生類別中出現了名稱相同的屬性,若想存取基底類別中的屬性而非衍生類別的屬性,就可以使用 base 來存取

3. 第二種可能用到 base 的狀況:當衍生類別 override 了一個基底類別的 method,若想存取原版 (原本在基底類別內的版本) 的 method,就可以用 base

4. 第三種可能用到 base 的狀況:想要呼叫基底類別的建構子 (constructor) 時,可以在自己的建構子後加上 base 來呼叫

補充

The Constructors of Base Classes 基底類別的建構子

本課有提到衍生類別 (Derived Class) 可以在自己的建構子呼叫基底類別 (Base Class) 的建構子。那麼如果不呼叫的話,基底類別的建構子就不會執行了嗎?

事實上,不明確呼叫基底類別的建構子時,C# 會自行去尋找基底類別是否有不需要參數的建構子。如果有的話,在建立衍生類別的物件時,呼叫衍生類別的建構子前就會偷偷地先呼叫基底類別的建構子。這是為了確保衍生類別之中,那些繼承的屬性都能夠被正確的初始化。因為一般來說,程式設計師都會將初始化的動作寫在建構子中。如果基底類別的建構子沒被呼叫的話,它的屬性就很有可能沒被初始化。

那要是基底類別沒有建構子呢?當一個類別沒有定義建構子時,C# 會偷偷幫他塞一個空的建構子。因此沒有定義建構子時不需要特別做任何事情。但是若基底類別只有定義需要參數的建構子,那麼衍生類別就一定要明確呼叫它。這樣才知道那些建構子的參數要放入甚麼值。


相關資訊連結

MSDN - base

https://msdn.microsoft.com/zh-tw/library/hfw7t1ce%28v=vs.90%29.aspx

MSDN - 使用建構函式

https://msdn.microsoft.com/zh-tw/library/ms173115.aspx

1 則留言: