iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

新手成為軟體工程師的技能樹點法&心路歷程 系列 第 9

Day 9. 新手也能懂的物件導向

新手在學寫程式時一定常常看到物件、類別、介面、抽象、繼承...奇怪的外星語,可能知道跟物件導向有關但又常常搞不清楚,畢竟程式就是一行一行執行下來,寫起來很直覺,也很好懂,但多了這些東西程式感覺就變得很複雜,想搞懂卻看文章看到頭暈腦脹。沒關係!這篇花一點點的時間說明,希望能對新手的學習有幫助。


類別(Class) VS 物件(Object)

首先,我們寫程式大部分都是寫在Class裡面,也就是類別,那類別跟物件有什麼關係?
物件(Object)就是類別(Class)的實體,類別(Class)就是物件(Object)的定義
聽不懂對吧?翻成白話文你或許就可以懂了
當你寫完的類別沒有被執行起來時,他只是一個文字檔,但當你的程式Build完要Run起來時,電腦會分配一些RAM的空間來執行你的程式,而當程式執行到你寫的類別時,他會去分配一些RAM的空間來給這個類別,這就是實體化,所以沒實體化以前,類別只是一些定義了物件實體化後要有哪些特徵的文字而已。以駭客任務(The Matrix)這電影來說,當你寫了一個Gun類別,再把母體的世界當成一個RAM裡面的空間,你就可以透過實體化這類別而得到一把槍(或是很多把槍),因此反抗軍再送救援物資給Neo時,其實只是把救援物資的類別丟到母體的執行緒裡面實體化而已。

物件導向三大特性(封裝,繼承,多型)

這題面試常常考,以前不懂時都是硬背答案,但我覺得現在懂了或許該用我自己的理解分享給新手,讓新手在面試時不要再用硬背答案的方式了

  1. 封裝:
    物件導向有著對物體內部用的定義,以及可以給外部的定義,例如大腦可以執行很多指令,例如接收五感(視覺、聽覺、嗅覺、味覺和觸-壓覺),操作手腳肌肉,但你無法憑自己的意志決定自己的心跳速率要有多快,因為這個方法只開放給內部使用(腦幹),但我們保留了一個心跳速率這個屬性給外部知道,讓醫生可以透過儀器測量出心跳速率,但他只能接收,不能改變他的值,因此如果寫成C#程式,這個屬性會可能是長成這樣
public double HeartBeat { get; private set; }

上方的心跳速率這個屬性是公開(public)的,大家都能取值(get方法),但要設定這值等於多少並不開放給外部(private set方法),其中要決定心跳速率要有多快可能是一個private的方法來決定,因此可能還會需要一斷類似這樣的Code

        private void SetHeartBeatValue()
        {
            //TODO:運算心跳的邏輯
            HeartBeat = 60;
        }
  1. 繼承:
    繼承就像是你讓某些你要的一些類別擁有一些同樣方法或特性,但你又不想一直複製貼上,你就可以透過抽出這些共用的方法特性寫成一個父類別,然後分別讓這些需要擁有這些方法特性的類別繼承他,以車子為例:
    public class Car
    {
        public int  Speed    { get; set; }
        public virtual void AddSpeed()
        {
            Speed += 1;
        }
        public virtual void TurnLeft()
        {
             //TODO:左轉的邏輯
        }
        public virtual void TurnRight()
        {
            //TODO:右轉的邏輯
        }
    }
    public class Tesla : Car
    {
        
    }

其中子類別特斯拉繼承了Car類別,因此他不用再寫加速、左轉、右轉的方法,別的地方實體化Tesla時,就會有這些方法能用了,例如

            var tesla = new Tesla();
            tesla.AddSpeed();
            tesla.TurnLeft();
            tesla.TurnRight();

而子類別繼承了父類別的特性要修改的話也能做到,例如我希望另一個類別法拉利的加速要快一點,我可以這樣

    public class Ferrari : Car
    {
        public override void AddSpeed()
        {
            base.Speed += 3;
        }
    }

關於C#的修飾詞,例如上面出現的public、private、virtual、override等等,本篇就不介紹了,請新手去看看其他鐵人賽有介紹C#的文章吧。
下一篇繼續介紹沒講完的多型~


上一篇
Day 8. 版控很重要!
下一篇
Day 10. 新手也能懂的物件導向 part 2
系列文
新手成為軟體工程師的技能樹點法&心路歷程 11

尚未有邦友留言

立即登入留言