摘要:物件導向系列菜單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"; }
}
}