【公告】網站目前停止所有的課程訂閱服務,原有學員權益不受影響,造成不便還請見諒,我們正在打造更多課程以及圖書,包含 Python 為主的課程主題,未來將會合併且擴充目前的課程內容,提供全新課程訂閱服務,感謝學員的支持。

介面多型設計

類別本身相容於其實作的介面,因此類別物件可以透過介面參照進行引用,考慮以下的程式碼:

interfaceA interfacea = objecta ;

假設其中的 objecta 是一個類別物件,此物件的類別實作了介面 InterfaceA ,這一行程式碼將其參照指定給另外一個宣告為 InterfaceA 型別的變數  interfacea,接下來 interfacea 可以被用來呼叫介面所定義的方法成員,執行類別實作的功能。

以下是一個介面 IMeasure 以及實作介面的類別 Square:

interface IMeasure
{
    void Length(double l);
    void Area(double l);
    void Volume(double l);
}
class Square : IMeasure
{
    public void Length(double l)
    {
        double squareLength;
        squareLength = 4 * l;
        Console.WriteLine
            ("邊長為{0} 的正方形周長= {1} ", l, squareLength);
    }
    public void Area(double l)
    {
        double area;
        area = Math.Pow(l, 2);
        Console.WriteLine
            ("邊長為{0} 的正方形面積= {1} ", l, area);
    }
    public void Volume(double l)
    {
        double volume;
        volume = Math.Pow(l, 3);
        Console.WriteLine
            ("邊長為{0} 的立方體體積= {1} ", l, volume);
    }
}

Square實作介面 IMeasure 中定義的方法成員,並且計算各種對應的正方形長度、寬度與體積輸出,現在於主程式中測試執行效果:

class Program
{
    static void Main(string[] args)
    {
        Square mySquare = new Square();
        IMeasure myIMeasure = mySquare ;
        myIMeasure.Length(5);
        myIMeasure.Area(5);
        myIMeasure.Volume(5);
        Console.ReadLine();
    }
}

一開始建立 Square實體物件 mySquare ,然後將其本身的物件參考設定給 IMeasure 介面型別物件 myIMeasure,現在myIMeasure是一個 IMeasure,接下來透過 myIMeasure 引用其中實作的方法成員輸出計算結果。

邊長為 5 的正方形周長 = 20
邊長為 5 的正方形面積 = 25
邊長為 5 的立方體體積 = 125

直接參照類別實體物件與介面物件,都可以達到所要的效果,使用介面參照最大的好處在於支援物件導向設計的多型機制,當多個類別同時實作相同介面,可以透過單一介面型別變數,執行不同的實體物件呼叫。

多型

我們利用另外一個範例說明多型的機制,以下簡化 IMeasure,僅配置 Length 方法提供幾何圖形的周長實作。

interface IMeasure
{
    void Length(double l);
}
class Square : IMeasure
{
    public void Length(double l)
    {
        double squareLength;
        squareLength = 4 * l;
        Console.WriteLine
            ("邊長為{0} 的正方形周長= {1} ", l, squareLength);
    }
}
class Circle : IMeasure
{
    public void Length(double r)
    {
        double circleLength;
        circleLength = 2 * Math.PI * r;
        Console.WriteLine
            ("邊長為{0} 的圓周長= {1} ", r, circleLength);
    }
}

Square與Circle均實作IMeasure介面,而其中的Length方法,則分別計算四方形周長與圓形周長,現在我們有兩個實作相同介面的類別,接下來於主程式進行測試:

class Program
{
    static void Main(string[] args)
    {
        IMeasure square = new Square();
        LengthMeasure(square, 10);
        Circle circle = new Circle();
        LengthMeasure(circle, 10);
        Console.ReadKey();
    }
    static void LengthMeasure(IMeasure measure, double l)
    {
        measure.Length(l);
    }
}

方法LengthMeasure接受任何IMeasure介面的實作類別物件以及要計算的長度值,於方法中透過measure引用Length方法完成邊長計算,由於所有IMeasure介面的實作類別一定實作Length方法,因此傳入任何實作物件都可以正常執行。

在Main方法中,分別建立 Square 物件與 Circle 物件,傳入LengthMeasure方法以執行正方形以及圓形周長的運算輸出。

多型機制可以讓應用程式設計更為彈性,也是大型系統常用的開發技巧。




沒有留言: