菜雞與物件導向 (7): 介面
如果說繼承是用來表明物件「屬於什麼」;那麼介面就是用來表明物件「能做什麼」。
如果說封裝是將物件視作一個整體,是隱藏複雜度;那麼介面就是封裝精神的體現。
如果說多型是指藉著繼承後能實作不同的行為的可能性達到擴展的彈性;那麼介面就是在實作多型。
介面就是這麼厲害,這麼瀟灑。介面就是我大哥,今天誰不服介面,對不起!我們不認識。
介面就像是針對類別的實作、物件的行為去做規定的一個契約書,會先定義好要實作這個介面的類別所必須要有的方法,而當我們建立符合這個介面的類別時,就必須實作出所有介面中定義好方法才可以。……這樣說起來實在太繞口,總而言之介面的核心概念只有一條:
我不在乎你是誰,我只在乎你能做什麼。
還是公司誠徵工程師的例子
由於介面基本上就是封裝繼承多型抽象之大雜燴,所以我們把前面多型的小明小華例子稍微修改來用吧。也就是以公司徵人的方式去理解介面。
介面就像是老闆開出來的要求列表,例如說:要會寫 C#、要會寫 SQL、要會 VB…等等,於是老闆就貼出了徵人啟示,要求新來的員工必須要有 IProgrammer 寫的能力:
public interface IProgrammer
{
void WriteCSharp();
void WriteSQL();
void WriteVB();
}
特別注意和前面多型的例子的不同處,介面只需要先定義好該做的事,裡面怎麼做不需要管;所以只需要宣告要求的方法,不需要撰寫方法本體。
於是今天小華就又(?)來面試了,但是他其實並不會寫 C#:
public class Hua : IProgrammer
{
// Error: Hua 未實作 IProgrammer.WriteCSharp()
public void WriteSQL() { /* Work */ }
public void WriteVB() { /* Work */ }
}
這時候編譯器就會跳出錯誤了:很抱歉,你不符合我們 IProgrammer 的規定,因為我們只喜歡訓練精英(略),請你實作完之後再來。否則你就不能掛上我們 : IProgrammer 的頭銜。
