2014年3月7日 星期五

小山的 C# 教學-第29課-繼承性(續)

本課簡介

本課延續上一課的繼承性的內容
說明透過繼承可以減少 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

39 則留言:

  1. 不好意思~
    請問之後C# 教學後面還會更新課程嗎?

    回覆刪除
    回覆
    1. 會,不過我這學期課業真的頗忙
      而且準備教學要花點時間整理要教的內容
      所以至今一直沒有時間好好來處理

      刪除
  2. 小山辛苦了,我是一個想走Technical Artist的畫圖人,現在在玩Unity,你的教學深入淺出又很有趣,真的很棒!
    學業加油,期待之後的課程!

    回覆刪除
    回覆
    1. 我也有玩過 Unity
      感謝你的支持~ 要好好加油哦

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 討論 Web 時,通常會分成客戶端 (Client) 跟伺服器 (Server) 來看

      Client 端指的是呈現在使用者的網頁
      一般不會使用 C# 來撰寫,而是用 HTML + CSS + Javascript 這種組合來寫
      Javascipt 雖然也有支援物件導向,除非要寫互動性很高的網頁
      不然通常不會用到太深入的概念

      Server 端指的則是使用者看不到的背後,所做的處理
      像是把使用者在購物網站上的訂單儲存起來等等
      這邊就有蠻多使用 C# + ASP.NET 撰寫的應用
      像是我剛剛提到的訂單,就可以使用 C# 的物件來做處理

      或是使用者玩了一個網頁遊戲,他們每一個人都有自己的腳色
      這些腳色也可以利用物件的概念來撰寫管理

      不知道這樣是否有回答到你的問題?

      刪除
    2. 小山老師您好:
        您說的這部分我聽懂了,但是在實作的時候還是有些不太一樣,感覺像是不需要應用,不知到是不是因為網站的類型不同,所以在應用的時候感覺沒有地方需要使用到物件導向。
        如果說在有使用到C# + ASP.NET + DB的情況下,製作的網站類似於gov網站或是形象網站,只是做一些基本的查詢、新增、修改、刪除或登入,這樣子我沒有應用到物件導向的概念是否正常呢?還是說其實我有應用到,只是我不知道而已呢?

      刪除
    3. 其實你只要以物件為基礎來寫程式,都可以算是物件導向哦~

      我個人認為,有沒有用到其實跟個人寫程式的方式有很大的關係
      物件導向比較像是寫程式的一種「方法」
      就算不用物件導向也能夠寫出差不多的程式

      所以閣下提到一些只做資料庫查詢以及更動動作的網站
      可以用物件導向來寫,也可以不用物件導向來寫
      像是從 Client 端傳資料到 Server 端可以用物件來傳遞
      也可以壓成一坨連在一起的文字來傳
      這些都取決於開發者的想法

      刪除
    4. 小山老師您好:
        所以是不是可以理解為,原本一頁寫很長的程式碼,將它拆成很多個小部分,再將它組合起來,就算沒有使用到物件導向三個特性,其實這樣子就算是物件導向的一種呢?

      刪除
    5. 這樣的話比較接近「模組化」的概念

      刪除
    6. 小山老師您好:
        很謝謝您願意為我解答,不過看來還有很多事物需要花時間去了解一翻呢。

      刪除
  4. 小山老師,辛苦你了,想請教您幾個問題~

    1.當我每看完小山老師影片後,都看得很清楚、明瞭,當想自己下去實作時,腦袋裡卻都完全空白,不知如何下手,到最後卻都變成邊做邊抄,要我自己寫卻都不知如何下筆去寫,依小山老師開發經驗,這是什麼問題,我該如何解決呢?

    回覆刪除
    回覆
    1. 很正常的~
      我覺得很多的學習都是先從模仿開始
      模仿久了之後,就會學到了很多種不同的寫法
      寫程式時,碰到類似的問題就能從腦中浮現看過的寫法

      如果多看看一些比較大的程式碼
      就能夠學習到如何將多種寫法整合在一起
      同時還能夠練習自己的分析能力與統合能力

      所以其實寫程式也是很需要多看範例練習的
      有興趣的話可以網路上多找找一些別人寫過的範例看看
      可以先試著自己寫寫看,再看看別人怎麼寫
      透過修正自己的問題也常常會學到不少東西哦~

      刪除
  5. 小山您的無私奉獻真的很感恩,之前買了書都看不懂,現在一聽完您的解釋再回頭去看書都明白了,這個網站真是受益良多。不知您有無出書的想法呢?
    期待下一集囉.....祝您學業all pass。

    回覆刪除
    回覆
    1. 我現在已經畢業囉~ 不過還是很謝謝你的祝福~

      刪除
  6. 不好意思..想問一個不怎麼聰明的問題@@"....
    我在C#的類別裡面使用If...else
    為什麼會顯示錯誤呢?(名稱'If'不存在於這個內容中)
    這.....這是什麼回事啊@@"

    還有小山大大,你的教學真是太棒了!!
    我一個完全沒玩過程式的人,看了你的教學.......真是......
    真是........多麼令人振奮啊!(含淚)
    原來........寫程式好似不是太難!

    (P.S.現在在IF....else卡關....有學習的捷徑嗎= =")

    回覆刪除
    回覆
    1. 我猜測你可能沒有將 if else 寫在 method 裡面
      因為程式碼的執行都是在 method 內進行
      method 外的區域都是用來定義 class 的 properties 跟 method 用的
      你可以先看看是不是這個問題

      寫程式只要找到方向其實不會太難哦!
      加油!

      刪除
  7. 小山大師~~您前面有提到 物件導向有三個特性 就是 封裝繼承和多型

    可是你都沒說到多型

    可不可以說一下多型是什麼??

    我好喜歡你講課的方式喔~~

    至少把三大特性交代一下拉~~大師~~~~~~

    回覆刪除
    回覆
    1. 哈哈~~~ 確實我一直沒有交代這部分
      不過研究所生活真是超乎想像地忙
      加上我最近正在趕論文
      所以之後的課程不知道何時才有空弄啊XD

      刪除
    2. 真的是受益良多,我期待您能有更新~!

      刪除
    3. 真的是受益良多,我期待您能有更新~!

      刪除
  8. 請問,
    (1) 繼承性, 可否 "繼承" 多個 ? HOW ?
    (2) 繼承性, 可否 "多層" 繼承 ? 即 B 繼承 C, 而 A 繼承 B ?

    回覆刪除
    回覆
    1. (1) C# 本身是不允許多重繼承的,但是有類似的東西叫做 implementation 跟 interface,詳細會在多型性中介紹
      (2) 允許,用法跟一般繼承相同

      刪除
  9. 因為實在是講的不錯,這幾天陸續看到這片了,觀念有很大的提升,真的謝謝上傳這樣用心的教學影片。

    回覆刪除
    回覆
    1. 恩恩~有理解對我來說就是很大的鼓勵XD

      刪除
  10. 感謝無私分享 受益良多

    回覆刪除
  11. 對於一個陌生工具, 直到看了你的影片,確實理解了很多,非常感謝你的無私,希望小山老師可以繼續上傳這樣用心的教學影片

    回覆刪除
  12. 對於一個陌生工具, 直到看了你的影片,確實理解了很多,非常感謝你的無私,希望小山老師可以繼續上傳這樣用心的教學影片

    回覆刪除
  13. 謝謝小山老師~受益良多

    回覆刪除
  14. 小山,您好
    我看到這篇文章的時候一直存在一個疑問,
    monster&villager在繼承creature的時候,內部使用到同一個HP變數,如果在creature內不附值給HP的話
    會不會使用到前面已經使用過的變數呢?
    還是說跟overloaded一樣,C#就是可以判定?

    回覆刪除
    回覆
    1. 基本上 class 這種東西可以想成是「設計圖」
      實際上建立出物件的時候,會是一個個獨立的個體
      因此裡面存的東西當然也都是各自區別開來的。

      雖然 Creature 裡面有 HP 變數
      但是實際上建立出 Monster 與 Villager 物件時
      他們都是一個個獨立的物件,因此他們都會有各自的 HP 變數
      所以不會有使用到對方數值的問題

      順帶一提,若沒有設定一個 property 的初始值的話
      預設會使用該型別的預設值
      例如 HP 因為是整數,所以預設會是 0

      刪除
  15. 請問如果我想獨自設定每種生物的攻擊力該怎麼辦? 因為小山老師寫的是受傷就是扣10滴,但我想嘗試讓每種生物都有不同攻擊力不知道該怎麼寫

    回覆刪除
    回覆
    1. 可以再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);

      刪除
    2. 更正 建構式沒有void >>> public Monster(int damage){

      刪除
  16. 請問繼承性只能繼承一個嗎
    可以 A class : B class : C class :... 這種寫法嗎?

    回覆刪除
  17. 小山老師您好:看完這部影片後還是不聊解VOID的method到底要甚麼時後做使用,像是我在原本的public int Attack()為甚麼將下方的程式碼改成vi.Injured(10); 後卻要改成VOID而不能直接return回去

    回覆刪除
    回覆
    1. void代表沒有任何值, 如果今天沒有要傳回任何資料才會打上void
      你先把傳回的地方關閉當然return不回去XD

      by剛看完這課的旅人

      刪除