[Object-oriented] 介面

[Object-oriented] : 介面


前言 :

介面
是在物件導向裡,是個不難懂,卻是很重要的東西。
筆者試著採用指標的方式,來解釋介面的運作。


介面 :

底下是一段介面的程式碼
這個程式碼很簡單,就是ClassA實作ISampleX而已

public interface ISampleX
{
    void XXX();
    void YYY();
}

public class ClassA : ISampleX
{
    public void XXX()
    {
        // ...
    }

    public void YYY()
    {
        // ...
    }

    public void ZZZ()
    {
        // ...
    }
}

當我們在程式內撰寫如下的程式
函式AAA與函式BBB內部同樣是呼叫item.XXX();
執行的結果也都相同都是執行ClassA.XXX()
但是在執行順序上卻是不同的

class Program
{
    static void Main(string[] args)
    {
        AAA(new ClassA());
        BBB(new ClassA());
    }

    public static void AAA(ClassA item)
    {
        item.XXX();
    }

    public static void BBB(ISampleX item)
    {
        item.XXX();
    }
}

函式AAA是參考ClassA
可以這樣理解

public static void AAA(ClassA item)
{
    item.XXX();
}


函式BBB是參考ISampleX
可以這樣理解

public static void BBB(ISampleX item)
{
    item.XXX();
}


可以看的出來當我們參考介面的時候
會在類別的外面多加一層
程式碼依照這層介面的定義,來呼叫實際的物件程式碼


參考 :

我們再來看下面的程式碼

public interface ISampleX
{
    void XXX();
    void YYY();
}

public class ClassA : ISampleX
{
    public void XXX()
    {
        // ...
    }

    public void YYY()
    {
        // ...
    }

    public void ZZZ()
    {
        // ...
    }
}

public class ClassB : ISampleX
{
    public void XXX()
    {
        // ...
    }

    public void YYY()
    {
        // ...
    }

    public void AAA()
    {
        // ...
    }
}

當我們在程式內撰寫如下的程式
函式BBB是參考ISampleX,但傳入的物件卻分別為ClassA及ClassB。
依照前面的說明,我們可以理解
ClassA及ClassB在傳入函式後,會加上一層名為ISampleX的外皮。
所以函式BBB還是可以正常的執行。

class Program
{
    static void Main(string[] args)
    {
        BBB(new ClassA());
        BBB(new ClassB());
    }

    public static void BBB(ISampleX item)
    {
        item.XXX();
    }
}

可以這樣理解


後記 :

本篇的文章,
描述了介面的運作,希望對大家有幫助^^


P.S.
本篇的內容大幅度的簡化了計算機結構的內容,用以傳達物件導向的概念。
實際電腦系統在運作的時候,比本篇說明的複雜很多 ^^"。

期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。