物件導向系列菜單 6-『 Interface 介面 』
c井字號 物件導向
Lastmod: 2019-12-11

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 之特性

特性 1 : 你不能將 NEW 關鍵字用在介面上。會發生編譯錯誤。

為什麼呢 ? 因為 interfacce 的方法與特性都沒有任何實作內容。假如你能夠從介面建立物件,該物件怎麼知道有什麼樣的行為呢???

    CanFly IFly = new ICanFly () ;

特性 2 : Interface不存放資料

		 interface ICanFly
    	{
         //介面不可以包含『欄位』,然而,當你在類別中實作此唯讀特性時,
         //對別的物件來說,看起來就象屬性。
         string flySpeed { get ;}

         //介面不存放資料,因為不能增加欄位,會編譯錯誤喔!
         string test = "Hello" ;

         string fly();
    	}

特性 3 : 一個類別可以實作多個介面

這就是可以做到類別C++的多重繼承。

		public class UnitityCar :Car , IDrive, ICanFly
    	{
       
    	}

特性 4 : 你不能夠實體化一個介面,但可以參照它

假設你有一個方法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;

特性 5 : 介面能夠繼承其他介面

由於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"; }
        	}
    	}

參考資料

comments powered by Disqus