Interface概念
介面(Interface)
你可以將他想成是商品契約,所有要商品的交易,都要經過這個商品契約來決定,例如裡面說交易單位是XXX,就是XXX,裡面如果說要在那交易,就是在那交易,不然有人(編譯器)會打斷你的腿的…很恐怖的…
Interface
使用時機
- 有時候,你必須根據物件能夠做什麼來將它們歸類。
- 想要做到類似C++中的多重繼承功能。
程式說明
建立UnitityCar
的類別,該類別為未來車的概念。它可以飛(Fly)
和跑(Run)
,但如果這時讓他繼承飛機類別讓他可以飛,有些飛機的屬性與方法不需用到,但如果在車類別新增飛的動作,但其它種車不會飛啊…。所以這時就需要用到Interface
。
首先新增兩個Interface
分別為ICanFly
與 IDrive
。ICanFly
定義飛的方法Fly() 與飛的速度FlySpeed
。IRun
定義跑的方法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"; }
}
}