本課延續上一課的繼承性的內容
說明透過繼承可以減少 Class 內部的程式碼
以增加程式碼的維護性
教學影片
注意:影片有高畫質 720P 的選項,可以看得更清楚喔!
重點提示
1. 在 C# 之中,被繼承的 Class 被稱為「Base Class」(基底類別),繼承的 Class 被稱為「Derived Class」(衍生類別)
2. 除了上一課提到,我們可以透過繼承把多個 Class 重複的程式碼寫在同一個 Class 以減少「Class 之間」的重複程式碼之外,我們也可以利用繼承減少「Class 內部」的重複程式碼
3. 如果我們想讓 Monster 可以攻擊不同的生物,像是村民或其他怪物,那可能需要為不同的生物撰寫不同版本的 Attack:
public void Attack(Villager villager) {
....
}
public void Attack(Monster monster) {
....
}
但是我們都知道 Villager 與 Monster 就繼承自 Creature,所以我們可以這樣寫:
public void Attack(Creature creature) {
....
}
這樣只要是 Creature 或是它的衍生類別,都可以被傳入 Attack 處理這樣就可以大大減少 Class 內部的重複程式碼
補充
Overloaded (多載)
之前已經提過了何謂 Overloaded,可以從下面的連結觀看之前的介紹
http://slmtsite.blogspot.tw/2013/04/c-17-constructor.html
相關資訊連結
微軟 MSDN 對於「繼承」的介紹
http://msdn.microsoft.com/zh-tw/library/ms173149.aspx
不好意思~
回覆刪除請問之後C# 教學後面還會更新課程嗎?
會,不過我這學期課業真的頗忙
刪除而且準備教學要花點時間整理要教的內容
所以至今一直沒有時間好好來處理
小山辛苦了,我是一個想走Technical Artist的畫圖人,現在在玩Unity,你的教學深入淺出又很有趣,真的很棒!
回覆刪除學業加油,期待之後的課程!
我也有玩過 Unity
刪除感謝你的支持~ 要好好加油哦
作者已經移除這則留言。
回覆刪除討論 Web 時,通常會分成客戶端 (Client) 跟伺服器 (Server) 來看
刪除Client 端指的是呈現在使用者的網頁
一般不會使用 C# 來撰寫,而是用 HTML + CSS + Javascript 這種組合來寫
Javascipt 雖然也有支援物件導向,除非要寫互動性很高的網頁
不然通常不會用到太深入的概念
Server 端指的則是使用者看不到的背後,所做的處理
像是把使用者在購物網站上的訂單儲存起來等等
這邊就有蠻多使用 C# + ASP.NET 撰寫的應用
像是我剛剛提到的訂單,就可以使用 C# 的物件來做處理
或是使用者玩了一個網頁遊戲,他們每一個人都有自己的腳色
這些腳色也可以利用物件的概念來撰寫管理
不知道這樣是否有回答到你的問題?
小山老師您好:
刪除您說的這部分我聽懂了,但是在實作的時候還是有些不太一樣,感覺像是不需要應用,不知到是不是因為網站的類型不同,所以在應用的時候感覺沒有地方需要使用到物件導向。
如果說在有使用到C# + ASP.NET + DB的情況下,製作的網站類似於gov網站或是形象網站,只是做一些基本的查詢、新增、修改、刪除或登入,這樣子我沒有應用到物件導向的概念是否正常呢?還是說其實我有應用到,只是我不知道而已呢?
其實你只要以物件為基礎來寫程式,都可以算是物件導向哦~
刪除我個人認為,有沒有用到其實跟個人寫程式的方式有很大的關係
物件導向比較像是寫程式的一種「方法」
就算不用物件導向也能夠寫出差不多的程式
所以閣下提到一些只做資料庫查詢以及更動動作的網站
可以用物件導向來寫,也可以不用物件導向來寫
像是從 Client 端傳資料到 Server 端可以用物件來傳遞
也可以壓成一坨連在一起的文字來傳
這些都取決於開發者的想法
小山老師您好:
刪除所以是不是可以理解為,原本一頁寫很長的程式碼,將它拆成很多個小部分,再將它組合起來,就算沒有使用到物件導向三個特性,其實這樣子就算是物件導向的一種呢?
這樣的話比較接近「模組化」的概念
刪除小山老師您好:
刪除很謝謝您願意為我解答,不過看來還有很多事物需要花時間去了解一翻呢。
小山老師,辛苦你了,想請教您幾個問題~
回覆刪除1.當我每看完小山老師影片後,都看得很清楚、明瞭,當想自己下去實作時,腦袋裡卻都完全空白,不知如何下手,到最後卻都變成邊做邊抄,要我自己寫卻都不知如何下筆去寫,依小山老師開發經驗,這是什麼問題,我該如何解決呢?
很正常的~
刪除我覺得很多的學習都是先從模仿開始
模仿久了之後,就會學到了很多種不同的寫法
寫程式時,碰到類似的問題就能從腦中浮現看過的寫法
如果多看看一些比較大的程式碼
就能夠學習到如何將多種寫法整合在一起
同時還能夠練習自己的分析能力與統合能力
所以其實寫程式也是很需要多看範例練習的
有興趣的話可以網路上多找找一些別人寫過的範例看看
可以先試著自己寫寫看,再看看別人怎麼寫
透過修正自己的問題也常常會學到不少東西哦~
小山您的無私奉獻真的很感恩,之前買了書都看不懂,現在一聽完您的解釋再回頭去看書都明白了,這個網站真是受益良多。不知您有無出書的想法呢?
回覆刪除期待下一集囉.....祝您學業all pass。
我現在已經畢業囉~ 不過還是很謝謝你的祝福~
刪除不好意思..想問一個不怎麼聰明的問題@@"....
回覆刪除我在C#的類別裡面使用If...else
為什麼會顯示錯誤呢?(名稱'If'不存在於這個內容中)
這.....這是什麼回事啊@@"
還有小山大大,你的教學真是太棒了!!
我一個完全沒玩過程式的人,看了你的教學.......真是......
真是........多麼令人振奮啊!(含淚)
原來........寫程式好似不是太難!
(P.S.現在在IF....else卡關....有學習的捷徑嗎= =")
我猜測你可能沒有將 if else 寫在 method 裡面
刪除因為程式碼的執行都是在 method 內進行
method 外的區域都是用來定義 class 的 properties 跟 method 用的
你可以先看看是不是這個問題
寫程式只要找到方向其實不會太難哦!
加油!
小山大師~~您前面有提到 物件導向有三個特性 就是 封裝繼承和多型
回覆刪除可是你都沒說到多型
可不可以說一下多型是什麼??
我好喜歡你講課的方式喔~~
至少把三大特性交代一下拉~~大師~~~~~~
哈哈~~~ 確實我一直沒有交代這部分
刪除不過研究所生活真是超乎想像地忙
加上我最近正在趕論文
所以之後的課程不知道何時才有空弄啊XD
真的是受益良多,我期待您能有更新~!
刪除真的是受益良多,我期待您能有更新~!
刪除請問,
回覆刪除(1) 繼承性, 可否 "繼承" 多個 ? HOW ?
(2) 繼承性, 可否 "多層" 繼承 ? 即 B 繼承 C, 而 A 繼承 B ?
(1) C# 本身是不允許多重繼承的,但是有類似的東西叫做 implementation 跟 interface,詳細會在多型性中介紹
刪除(2) 允許,用法跟一般繼承相同
因為實在是講的不錯,這幾天陸續看到這片了,觀念有很大的提升,真的謝謝上傳這樣用心的教學影片。
回覆刪除恩恩~有理解對我來說就是很大的鼓勵XD
刪除感謝無私分享 受益良多
回覆刪除謝謝支持~
刪除對於一個陌生工具, 直到看了你的影片,確實理解了很多,非常感謝你的無私,希望小山老師可以繼續上傳這樣用心的教學影片
回覆刪除對於一個陌生工具, 直到看了你的影片,確實理解了很多,非常感謝你的無私,希望小山老師可以繼續上傳這樣用心的教學影片
回覆刪除謝謝小山老師~受益良多
回覆刪除謝謝你的支持
刪除小山,您好
回覆刪除我看到這篇文章的時候一直存在一個疑問,
monster&villager在繼承creature的時候,內部使用到同一個HP變數,如果在creature內不附值給HP的話
會不會使用到前面已經使用過的變數呢?
還是說跟overloaded一樣,C#就是可以判定?
基本上 class 這種東西可以想成是「設計圖」
刪除實際上建立出物件的時候,會是一個個獨立的個體
因此裡面存的東西當然也都是各自區別開來的。
雖然 Creature 裡面有 HP 變數
但是實際上建立出 Monster 與 Villager 物件時
他們都是一個個獨立的物件,因此他們都會有各自的 HP 變數
所以不會有使用到對方數值的問題
順帶一提,若沒有設定一個 property 的初始值的話
預設會使用該型別的預設值
例如 HP 因為是整數,所以預設會是 0
請問如果我想獨自設定每種生物的攻擊力該怎麼辦? 因為小山老師寫的是受傷就是扣10滴,但我想嘗試讓每種生物都有不同攻擊力不知道該怎麼寫
回覆刪除可以再monster 加入建構式,並在裡面加入攻擊力的設定
刪除如:
private int damage_Value;
public void Monster(int damage){
damage_Value=damage;
}
//並修改Attack method
public void Attack(Creature creature) {
creature.injured(damage_Value);
//回到button new怪物時要設定攻擊力 例如:20
Monster M1 = new Monster(20);
更正 建構式沒有void >>> public Monster(int damage){
刪除請問繼承性只能繼承一個嗎
回覆刪除可以 A class : B class : C class :... 這種寫法嗎?
小山老師您好:看完這部影片後還是不聊解VOID的method到底要甚麼時後做使用,像是我在原本的public int Attack()為甚麼將下方的程式碼改成vi.Injured(10); 後卻要改成VOID而不能直接return回去
回覆刪除void代表沒有任何值, 如果今天沒有要傳回任何資料才會打上void
刪除你先把傳回的地方關閉當然return不回去XD
by剛看完這課的旅人