[心得整理] c# 物件導向程式 - 3.抽象與介面 interface

[心得整理] c# 物件導向程式 - 3.抽象與介面 interface 

前言

物件導向程式加入了抽象的觀念,但我對於抽象觀念也卡關很久,想如何寫抽象文章也苦惱許久
本篇文章是我非常主觀的認知,若有偏差請多包含

現實生活中的抽象

最近喜歡用手機來比喻抽象,因為很貼近生活化
想請問讀者,若您要跟朋友借手機打電話時是用下列哪種說法
1. 小明,你的手機可以借我打回家一下嗎?
2. 小明,你的iphone 7S 可以借我打回家一下嗎?

應該大家都是選1吧,因為手機是抽象的,重點是在於我要可以打電話的裝置
至於是啥型號不是重點,用抽象的句子還可以用在任何人
另一種場合,當在電影院或是上課聽演講通常都會說
請將手機調靜音或轉振動,
而不會是說請iphone 4,4s,5,5s,hTC m8,m9........等調靜音或轉振動
一樣的理由,手機是抽象的
手機這抽象的詞表達的共識上一般包含打電話,可以開機關機,可以調整音量,轉振動
不需要指定到型號才會知道

程式的抽象

物件導向程式的抽象,我用interface (介面) 來說明

interface  快速記憶法
interface  就像是只會出一張嘴的老闆
只會簽合約自己卻不做事

先簡單介紹一下interface ,先看一下interface 的code

public interface I手機
{
    string 打電話(string 電話號碼);
    string 掛電話();
    string 調音量(int 音量大小);
    string 轉振動();
}

我建立一個interface 叫做I手機
我定義 四個方法簽章 (注意沒有實做的程式碼)msdn方法簽章
這樣就是interface 程式碼,只要繼承的class就必須要實做那四個方法
沒有實做的話,會建置失敗 (build不過,編譯器會去檢查)

那來完成一下class的程式碼

public class iphone4S : I手機
{
    public string 打電話(string 電話號碼)
    {
        Console.WriteLine("iOS打電話給"+ 電話號碼);
        return "撥號中";
    }

    public string 掛電話()
    {
        Console.WriteLine("iOS將通話中電話結束");
        return "結束通話";
    }

    public string 調音量(int 音量大小)
    {
        Console.WriteLine("iOS將音量調整為" + 音量大小);
        return "完成調音量";
    }

    public string 轉振動()
    {
        Console.WriteLine("iOS將轉振動");
        return "完成轉振動";
    }

    public string 呼叫Siri(string 指令)
    {
        //注意這是I手機沒有定義的方法
        return "Siri說" + 指令;
    }
}

來寫一段code說明差別

iphone4S myPhone = new iphone4S();
I手機 phone = new iphone4S();

比較兩個物件能使用的方法 會發現到new給I手機的phone沒有呼叫Siri方法對吧
因為I手機沒有定義呼叫Siri的方法簽章,所以不會出現,這樣可以理解嗎


這樣我在建立其他手機型號時,一樣去繼承I手機 就一定會有那四個方法(沒實做會build不過,編譯器會去檢查)
所以 我要打電話 或是 轉振動 就可以透過I手機 不一定要透過class(實際型號)

這樣介面就達到抽象的目的,我只需要I手機,不需要知道每一支手機型號
還記得三大特性嗎 介面用到繼承與多型結合起來,抽象的觀念應用

interface 可以當參數傳,可以當回傳值,可以用來當泛型約束條件,
一定要多使用或多寫練習code,這樣就容易上手了

PS.C#中不只介面可以抽象,還有一個更難以理解的抽象類別Abstract class,恩下次有時間聊

結語

還記得快速記憶法嗎?形容是否大家覺得貼切呢
介面在物件導向程式非常重要,接下來寫的物件導向介紹文章
會不停提到介面,希望這邊文章能夠先讓大家理解抽象觀念與介面

#抽象觀念建立起來 , 之後學習 像是 策略模式 就不會太難了

如果內容有誤請多鞭策謝謝