物件導向系列菜單6-『Interface介面』

摘要:物件導向系列菜單6-『物件導向-Interface介面』

陳夢吉:歡哥~!
歡哥:師父你找我啊~?
陳夢吉:你跟了我著麼多年,我要考考你。
陳夢吉:有位官爺的兒子,他繼承了他老爸的財產~,但他同時也想繼承他乾爸的財產。著麼辦呢~?
歡哥:不知道也~
陳夢吉:你還是去彌頓號九號剪頭髮好了~
 

 
正文開始
本文討論主題
『Interface的使用方法與特性』
 

 

『Interface的使用方法與特性』

 

Interface概念
介面(Interface)你可以將他想成是商品契約,所有要做交易的商品,都要經過這個
商品契約來決定,例如裡面說交易單位是XXX,就是XXX,裡面如果說
要在那交易,就是在那交易,不然有人(編譯器)會打斷你的腿的…很恐怖的…
 
Interface使用時機
1.有時候,你必預根據物件能夠做什麼來將它們歸類。
2.想要做到類似C++中的多重繼承功能。
 
程式說明
今天我們建立個UnitityCar的類別,該類別為未來車的概念。
它可以『飛(Fly)』和『跑(Run)』,但如果這時讓他繼承飛機
類別讓他可以飛,有些飛機的屬性與方法不需用到,但如果
在車類別新增飛的動作,但其它種車不會飛啊…。所以這時
我們就需要用到Interface。

 

首先新增兩個Interface分別為ICanFly 與 IRun,

ICanFly定義飛的方法Fly() 與飛的速度FlySpeed,
IRun定義跑的方法Run()與跑的速度RunSpeed。
(註:新增IRun Interface只是要給各位官爺看多個Interface使用。)

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

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

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

    }

//宣告IRun介面
    interface IRun
    {
        
        string RunSpeed { get ; set; }
        
        //任何實作此介面的類別,必需具備接受Run()方法。
        string Run();
      
    }

 

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

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

        }

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

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

        //一定要有!!!不然有人會打斷你的腿。
        public string Fly()
        {
            return "Fly" + FlySpeed;
        }
    }
實體化UnitityCar為MyCar物件。

UnitityCar MyCar = new UnitityCar { RunSpeed ="50" };

            TextBox1.Text = MyCar.Drive();
            TextBox6.Text = MyCar.Fly();
執行結果

 

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

ICanFly IFly = new ICanFly () ;

 

2.Interface不存放資料

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

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


         string Fly();

    }

 

3.一個類別可以實作多個介面
這就是可以做到類別C++的多重繼承。
 

 public class UnitityCar :Car , IRun, 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"; }

        }
    }

 

 



小弟才書學淺~請各位客官指教指教~~~

小弟日 : 你要知道自已不是帥哥,你才有可能變成帥哥 。