C# 繼承 – (C#教程) – Inheritance 繼承就是把多個Class, 來歸納為一個抽象的Class, 以父類(抽象的Class)為模版, 遺傳至子類.
首先, 為何要有類(Class)
因為程式要整合起來才有個體, 流程, 程式才能產生作用
1) 在未設計程式結構之前, 資料是一片散亂, 而有待整合.
2) 而OOP等的方法正是以類別作思考整合的基礎, 把要處理的事項歸納作一個個的類別. 類別內有屬於他自己的特性, 要Property, Method等
3) 以類別來決定Program的流程, 把類別的Instance放入流程處理 (流程就像一個盒子, 類的資料輸入至盒子, 盒子處理後再輸出結果)
繼承關係:
在一個繼承的關係裏, 最少有2個類, 一個父類, 和一個子類.
父類是一個抽象的類別. 例如動物類, 帶有自己的Method和Property.
子類是父類的實作類別, 例如狗類, 馬類, 羊類, 它可以帶有部份父類的Method和Property. 亦可以有的己獨有的Method和Property(而父類沒有的).
子類可以說是遺傳父類的內容. 而當中遺傳多少, 由程序員決定.
繼承用法: 如何決定遺傳父類內容
用modifier: public, protected, private就可以了
public: 可以遺傳至子類, 而外部的類也能使用到
protected: 可以遺傳至子類, 而外部的類不能使用到
private: 不可以遺傳至子類, 而外部的類不能使用到
用Keyword: override
override: 程序員可以複寫父類Method的內容. 在複寫的Method, 用”base.methodname()”可以叫回父類Method的內容
繼承好處: 而這又有何好處呢?
1) 以類來組織事物以較有條理. 繼承可以令人把相似的類別, 用一套類別來思考, 減少散亂.
2) 抽象帶來的便利, 只要在父類下的子類, 都可assing到同一個variable, 這樣放入流程, 如一個Method, 就可代碼重用了.
繼承用法: 如何實作
1) 當子類們有相同父類的method, property, 因可assing到同一個variable, 令它們可以放入同一個List, Array中. 以List, Array把它們串連起來, 再用foreach迴圈等令它們可以一起運作相同的code.
2) 而子類可以用override把method重寫, 令到coding 可以用同一個for loop (同一套流程 (如control flow等)), 來運行具有不同的程式內容的Method.
3) 先可以把一群相似的子類的method, property等抽出來, 放在抽象類中, 讓日後讓子類重用. 而當以也可反過來, 先設立抽象Class, 再以此為基礎來發展出新的後屬類, 但能否做到如此就看經驗了(Programming 及 Business Logic).
以下會舉一個簡單的生活例子 (Inherit 繼承) 以顯示出Inheritance 的基本用法, 以下供各位參考:
Abstract Class Master: |
abstract class Master{ public abstract void Play(); public abstract void Sleep(); public abstract void Eat(); public abstract void UpdateState(); public virtual bool isSleepy { get { return 0; } } public virtual bool isBoring { get { return 0; } } public virtual bool isDestory { get { return 0; } } public virtual bool isHungry { get { return 0; } } public void UpdateState(){ sleepy++; boring++; hungry++; } } |
Inherit Class Cat: |
class Cat : Master { string name; string sleepy = 0; string boring = 0; string hungry = 0; public Cat(string name){ this.name = name; } public override bool isSleepy { get { return sleepy > 80; }} public override bool isBoring { get { return boring > 70; }} public override bool isDestory { get { return boring > 95; }} public override bool isHungry { get { return hungry > 75; }} public void Play(){ Console.WriteLine(“Cat ” + name + ” Play”); boring = 0; } public void Sleep(){ Console.WriteLine(“Cat ” + name + ” Sleep”); sleepy = 0; } public void Eat(){ Console.WriteLine(“Cat ” + name + ” Eat”); hungry = 0; } public void DestoryYourHome(){ Console.WriteLine(“Cat ” + name + ” Destory Your Home Now.”); hungry = 0; } } |
Inherit Class Dog: |
class Dog : Master { string name; string sleepy = 0; string boring = 0; string hungry = 0; public Dog(string name){ this.name = name; } public override bool isSleepy { get { return sleepy > 50; }} public override bool isBoring { get { return boring > 40; }} public override bool isDestory { get { return boring > 80; }} public override bool isHungry { get { return hungry > 60; }} public void Play(){ Console.WriteLine(“Dog ” + name + ” Play”); boring = 0; } public void Sleep(){ Console.WriteLine(“Dog ” + name + ” Sleep”); sleepy = 0; } public void Eat(){ Console.WriteLine(“Dog ” + name + ” Eat”); hungry = 0; } public void DestoryYourHome(){ Console.WriteLine(“Dog ” + name + ” Destory Your Home Now.”); hungry = 0; } } |
Running Class: |
class Environment{ public bool HaveFood = true; public bool HaveSlavery = true; //Running Point public void Run(){ List<Master> animals = new List<Master>(); animals.Add(new Cat(“Petty”)); animals.Add(new Dog(“Jerry”)); animals.Add(new Cat(“Potty”)); while(true) { foreach(Master animal in animals){ animals.UpdateState(); if (animal.isSleepy()){ animal.Sleep(); } else if (HaveFood && animal.isHungry()){ animal.Eat(); } else if (HaveSlavery && animal.isBoring()){ animal.Play(); } else if (!HaveSlavery && animal.isDestory()){ animal.DestoryYourHome(); } } Thread.Sleep(1000); //Every Second } } } |
注意事項 |
1) Environment.Run 是入口首先把幾個Cat, Dog的Instance放入List<Master>內 2) 用while及Thread.Sleep 行每秒行一次在foreach的方法內, 會把每一位Master(主子—Cat, dog)的行為行一次 3) 首先UpdateState (在Master class 內的共用方法)然後看看isSleepy, 如果是true 的話就Sleep(); 4) 然後看看HaveFood及isHungry, 如果是true 的話就Eat(); 5) 然後看看HaveSalavry及isBoring, 如果是奴才在家(HaveSalavry== true) 的話就同主子 Play(); 6) 然後看看HaveSalavry及isBoring, 如果是奴才不在家(HaveSalavry == false)的話, DestoryYourHome(); 7) 在Cat同Dog的 isSleepy, isBoring, isDestory, isHungry 內, 大家的Logic也可不一樣。 |
相關頁面:
C#類別 – Class, Method, Inheritance, Interface的基礎用法
C#介面 – Interface 介面 的基本用法 – 加入 for loop, if, Array, Collection的例子
參考資料: https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/inheritance