almost 3 years ago

Interface概念

介面(Interface)你可以將他想成是商品契約,所有要商品的交易,都要經過這個商品契約來決定,例如裡面說交易單位是XXX,就是XXX,裡面如果說要在那交易,就是在那交易,不然有人(編譯器)會打斷你的腿的…很恐怖的…

Interface使用時機

  • 有時候,你必須根據物件能夠做什麼來將它們歸類。
  • 想要做到類似C++中的多重繼承功能。

程式說明
建立UnitityCar的類別,該類別為未來車的概念。它可以飛(Fly)跑(Run),但如果這時讓他繼承飛機類別讓他可以飛,有些飛機的屬性與方法不需用到,但如果在車類別新增飛的動作,但其它種車不會飛啊…。所以這時就需要用到Interface

首先新增兩個Interface分別為ICanFlyIDriveICanFly定義飛的方法Fly() 與飛的速度FlySpeedIRun定義跑的方法Run()與跑的速度RunSpeed
(註:新增IRun Interface只是要給各位官爺看多個Interface使用)

//宣告ICanFly介面
 interface ICanFly
{
     //介面不可以包含『欄位』。
     string flySpeed { get ;}

    //介面不存放資料,因為不能增加欄位
     //string test = "Hello";

     //任何實作該介面的類別必需具備一個接受Fly()的方法。
     string fly();

}

//宣告IDrive介面
interface IDrive
{
    //driveSpeed屬性,但介面不儲存資料,所以不會有欄位。
    string driveSpeed { get ; set; }

    //任何實作此介面的類別,必需具備接受 drive() 方法。
    string drive();

}

UnitityCar 繼承基底類別 Car,並實作 IDrive 與 IcanFly ,記得任何實作介面的類別都必需符合它的方法與屬性。

 //繼承基底類別Car
//並實作IDrive與IcanFly Interface
//假設UnitityCar在未來,他有兩個種類方法Drive與Fly。
public class UnitityCar :Car , IDrive, ICanFly
{
    //由於在未來飛行速度(FlySpeed),有限制100,
    //因此設立唯讀的FlySpeed,不給人修改。
    //一定要有!!!不然有人會打斷你的腿。
    public string flySpeed
    {
        get { return "100"; }
    }

    //在未來UnitityCar還是可以開,而且無限制時速
    //所以設立 driveSpeed可自行控制。
    //一定要有!!!不然有人會打斷你的腿。
    public string driveSpeed
    {
        set { string Speed; }
        get { return Speed ; }
    }

    //一定要有!!!不然有人會打斷你的腿。
    public string drive()
    {
        return "Drive~~" + DriveSpeed ;
    }

    //一定要有!!!不然有人會打斷你的腿。
    public string fly()
    {
        return "Fly" + FlySpeed;
    }
}

實體化UnitityCar為MyCar物件。

UnitityCar myCar = new UnitityCar { RunSpeed ="50" };
TextBox1.Text = myCar.drive();
TextBox6.Text = myCar.fly();

執行結果
Drive~~50
Fly 100

Interface 之特性

  • 你不能將NEW關鍵字用在介面上。會發生編譯錯誤~。
    為什麼呢?因為它(Interfacce)的方法與特性都沒有任何實作內容。
    假如你能夠從介面建立物件,該物件怎麼知道有什麼樣的行為呢???

    ICanFly IFly = new ICanFly () ;
    
  • Interface不存放資料。

     interface ICanFly
    {
     //介面不可以包含『欄位』,然而,當你在類別中實作此唯讀特性時,
     //對別的物件來說,看起來就象屬性。
     string flySpeed { get ;}
    
     //介面不存放資料,因為不能增加欄位,會編譯錯誤喔!
     string test = "Hello" ;
    
     string fly();
    }
    
  • 一個類別可以實作多個介面。
    這就是可以做到類別C++的多重繼承。

    public class UnitityCar :Car , IDrive, ICanFly
    {
    
    }
    
  • 你不能夠實體化一個介面,但可以參照它。
    假設你有一個方法Fly(),你需要一個能夠執行Fly(),任何
    實作ICanFly介面的物件都可以。這正是介面參考(Interface reference)發揮作用的地方。iFly參照任何實作ICanFly的物件(MyCar)。

    UnitityCar MyCar = new UnitityCar { RunSpeed ="50" };
        //即時物件能夠做很多事,但是,當你使用介面參考時,
        //你只能存取到介面中所宣告的方法。
        ICanFly iFly = MyCar;
    
         TextBox1.Text = iFly.fly();
        TextBox6.Text = iFly.flySpeed;
    
  • 介面能夠繼承其他介面,由於IBirdFly繼承Fly介面,因此也需要
    實作Fly()方法與FlySpeed屬性。

    //實作IBirdFly,由於IBirdFly繼承Fly介面,
    //因此也需要實作Fly的方法。
    public class Bird : IBirdFly
    {
        public string fly_Bird()
        {
        return "Bird~~~Fly~~~~" ;
        }
    
        public string fly()
        {
        return "Fly" ;
        }
        public string flySpeed
        {
        get { return "100"; }
        }
    }
    

參考資料

http://msdn.microsoft.com/zh-tw/library/ms173156.aspx
http://jimmy0222.pixnet.net/blog/post/37050866-%5Bc%23%5D-interface-%E4%BB%8B%E9%9D%A2%E3%80%81%E6%8E%A5%E5%8F%A3-%E4%B8%80)(
http://msdn.microsoft.com/zh-tw/library/w86s7x04.aspx

← 物件導向系列菜單5-『物件導向特性-繼承(Inheritance)4-abstract』 物件導向系列菜單7-『部分類別(Partial Class)』 →
 
comments powered by Disqus