此課將介紹如何使用「建構子 Constructor」來簡化程式碼
並做好物件初始化的工作
教學影片
注意:影片有高畫質 720P 的選項,可以看得更清楚喔!
重點提示
1. 所謂「建構子」就是一種特殊的 method,它的特徵有兩個:
(1) 不需要設定 output 型別
(2) method 名稱與 class 名稱相同
2. 如果想要讓某個屬性的值預先設定好,可以在建構子內就指定一個數值給它
3. 建構子也能夠接受 input (輸入值、引數),目的是要用來幫助物件做一些初始的設定
4. 如果建構子需要接受初始值,那必須要在建立物件時給予。
例如:
Student s = new Student(10201, "小山");
5. 為了因應不同的情況,可以在 class 內撰寫多個建構子。就算名稱相同,只要輸入值的數量與型別不同即可。這種作法稱為 Overloaded (詳情請看補充)
6. 如果沒有撰寫建構子,編譯器會自動幫 class 產生一個沒有引數的預設建構子。
7. 如果自己有撰寫建構子,編譯器就不會自動幫 class 產生預設建構子。
補充
Overloaded 多載
並不是只有建構子才有 overloaded ,只要是 method 都有可能會有這樣的性質。如果今天有兩個 method,這兩個 method 的名稱相同,但是 signatures 不同,那就是 overloaded。
那甚麼是 signature 呢?signatures 指的就是引數(輸入值)的種類、數目、排列與 method 名稱,例如下面這兩個 method 他們的變數名稱雖然不同,但是因為種類相同,method 名稱也相同,所以 signatures 就算相同。
Example 1:
void sleep(int time, string s) {....}
void sleep(int sleepTime, string sound) {....}
而下面這兩個雖然引數數目相同,但是型別不同,所以 signatures 就不相同
Example 2:
void eat(int numberOfFood) {....}
void eat(string foodName) {....}
因此我們只需要辨別 signatures ,就可以知道 method 是否有重複。重複的 method 是沒有意義的,因為這種情況下,程式無法得知你到底是要呼叫哪一個 method。如 Ex1 中,C# 會當作沒看到第二個 method,所以你永遠無法呼叫到它。那你又為何要這樣寫呢?另外一個常見問題是,引數與 method 名稱都相同,但是 output 型別不同算是重複嗎?
答案是,算!請看下面這個例子
Example 3:
int run() {...}
void run() {...}
如果我今天呼叫 run() 的話,你可以辨別我是要呼叫哪一個 run() 嗎?相信你應該了解了吧?這就是為什麼這樣也算是重複的 method。
教得好詳細,加油喔,期待下集中~~
回覆刪除感謝支持 ^^
刪除小山的教學真的很棒!!
回覆刪除我上網查了很久一些C#的東西,但是真的都有看沒有懂。
你把整個流程講解一遍之後,我才了解原來是這樣的概念阿!!!
我認真覺得為什麼其他網路或書上都要寫得那麼複雜....!?
也有寫得不複雜的書啦XD
刪除看了書再看了小山的講解簡直就是如魚得水啊!!!
回覆刪除獲益良多
回覆刪除小山老師,想請教關於多載的問題
回覆刪除您影片中建了兩個建構子分別是 public student(int id,string name,int grade){......} public student(int id,string name,int height){....}
然後在另一個class中 new Student(x,y,z) 其中 int x,z; string y; 電腦要怎麼知道他要選擇哪一個建構子壓?
這個問題問得很好
刪除如果你實際嘗試一下的話,你會發現那段程式其實不能執行。
原因就跟你說的一樣,程式無法辨別你到底要選哪一個建構子。因此當你呼叫的時候就會出現錯誤。
啊.....是下一課的影片中(this)才對
回覆刪除作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
回覆刪除十分感謝你的教學,讓我們初學自學者更容易學會
回覆刪除感謝小山老師的詳細解說!!
回覆刪除